所以我有一个简单的循环函数,它返回Promise
。看起来像这样:
for (var i = 0; i < categories.length; i++) {
parseCategory(categories[i]).then(function() {
// now go to the next category
})
}
是否有可能等到第一个函数结束并迭代到下一个元素?
P.S。 没有必要使用承诺。
答案 0 :(得分:1)
如果你想在没有库的情况下在ES6中这样做:
var parseCategoryPromise = Promise.resolve();
for (var i = 0; i < categories.length; i++) {
(function(i){
parseCategoryPromise = parseCategoryPromise.then(function(){
return parseCategory(categories[i])
});
})(i)
}
答案 1 :(得分:0)
如果你已经在使用Promises,为什么不一直走?最好的Promise模块Bluebird有一个辅助函数,专门设计用于迭代遍历数组,串行控制执行:http://bluebirdjs.com/docs/api/promise.mapseries.html。你这样使用它:
Promise.mapSeries(categories, function(category) {
// Parse the category, and return a value or a promise.
});
如果parseCategory是在别处定义的函数,你甚至可以得到更简短的信息:
Promise.mapSeries(categories, parseCategory);
还有一个map
姐妹函数可以并行执行调用。
答案 2 :(得分:0)
通过await / async支持,你可以很容易地做到这一点:
async function parseCategories (categories) {
for (var i = 0; i < categories.length; i++) {
await parseCategory(categories[i])
}
}