我不是在寻找如何按顺序执行promises的解决方案,我正在尝试理解博客作者给出的一个:
我正在阅读2015年5月18日发布的Nolan Lawson "We have a problem with promises"。
在“高级错误#3:承诺与承诺工厂”之下,他有这个应该是工作的例子:
// Setup, just a meta explanation what a function looks like
function promiseFactory() {
return somethingThatCreatesAPromise();
}
// Actual example; promiseFactories could be an Array
function executeSequentially(promiseFactories) {
var result = Promise.resolve();
promiseFactories.forEach(function (promiseFactory) {
result = result.then(promiseFactory);
});
return result;
}
我不明白为什么会有效。 forEach
一次执行所有功能。 result
将是一个已解决的承诺,因此promiseFactory
会马上运行吗?
我不知道这段代码应该如何确保promiseFactory
函数中的代码按顺序运行。
答案 0 :(得分:3)
forEach
一次执行所有功能
不,它一个接一个地运行。。 forEach
非异步。
让我们看一个示例迭代:
// The first result is already resolved, so as to allow
// the first 'then' to trigger
var result = Promise.resolve();
promiseFactories.forEach(function (promiseFactory) {
// First iteration: result = ResolvedPromise.then(promiseFactory)
// Second iteration result = promiseFactoryResult.then(nextPromiseFactory);
// and so on...
result = result.then(promiseFactory);
});
因此,它一个接一个地循环遍历类似数组的对象,将nextPromiseFactory
创建的promise的结果链接到result
变量。
它基本上和做的一样:
var result = Promise.resolve().then(promiseFactory).then(promiseFactory).then(promiseFactory);