在 JS 中使 for 循环在没有库的情况下等待
Making a for loop wait WITHOUT a library in JS
如何在没有库(如jQuery)的情况下开始循环的新迭代之前创建一个等待异步调用完成的for
循环?
例:
var items = [1,2,3,4,5];
for (var i = 0; i < items.length; i++) {
var promise = new Promise(function(resolve, reject){
asyncAPIcall({
body : item[i]
}, function(error, response){
if(error) {
reject();
} else {
resolve();
}
});
promise.then(function() {
//continue loop
}, function() {
//break loop
});
}
谢谢
更新 (4/29)
我想到了这个解决方案,我创建了一个调用自己的函数:
var items = [1,2,3,4,5];
var counter = items.length - 1; //minus one since array is zero based.
function myLoop(){
asyncAPIcall({
body : item[counter]
}, function(error, response){
if(error) {
// Error message.
} else {
counter = counter - 1;
if(counter == -1){
//Done
}
else {
myLoop();
}
}
});
}
您可以使用reduce使它们按顺序处理(或使用常规的for循环设置承诺链 - 我自己更喜欢reduce)。
let promise = items.reduce((carry, current) => {
return carry.then(arr => {
return asyncAPIcall({ body: current }).then(result => arr.concat([ result ]));
});
}, Promise.resolve([]));
promise.then(finalResult => {
console.log('final result:', finalResult);
});
但是,如果您实际上不需要捕获这些承诺决议的结果,这可能比您需要的要多。另请注意,您仍然会在它的末尾有一个 promise,它将包含每个 promise 的结果数组,对应于它们的原始数组位置。
另外,这是asyncAPIcall
的模拟版本,如果您想跟踪方法的调用方式/位置,它应该有助于在此处显示操作顺序。
function asyncAPIcall(obj) {
console.log('asyncAPIcall for:', obj);
return new Promise((resolve) => {
setTimeout(() => {
let resolution = obj.body + 5; // change the value in some way, just to show that input !== output
console.log('resolving with:', resolution);
return resolve(resolution);
}, 100);
});
}
相关文章:
- 如何在未直接触发的情况下停止事件
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 在不阻止默认行为的情况下检测IE10中的缩放
- 如何在不传递此信息的情况下查找被调用的元素
- 如何在不刷新页面的情况下更新显示框
- 有没有一种方法可以在控制台关闭的情况下让console.log()在IE中记录消息
- JavaScript-在手机上不工作的情况下,在外部单击时隐藏元素
- 在我的情况下,如何进行http请求
- 在不知道深度或父属性的情况下从对象中删除属性
- 在 JS 中使 for 循环在没有库的情况下等待
- 如何在不停止脚本的情况下等待
- 如何在不等待用户使用 JavaScript 键入字符的情况下检查 capslock 是否打开
- 如何在零隐式等待的情况下检查硒中是否存在警报
- JQuery Promise:fail()在未等待Promise解析的情况下被调用
- $.ajax在不挂起UI的情况下等待完成
- 如何在不等待ajax响应的情况下执行计数统计
- AngularJS的承诺在没有等待异步响应的情况下被拒绝(它应该会被解析)
- href/button单击将否决下一步,并在不等待用户输入的情况下执行操作