我正在尝试运行一个循环,其中为每次迭代创建一个promise
和它自己的then
。我只想在按顺序执行所有诺言时才打印“完成”。无论我做什么,“完成”总是在“渲染”之前执行!
我知道这听起来像是重复的,但是没有任何效果,也许每次迭代都添加一个promise
和一个'then'就是问题所在。
let p = Promise.resolve<void>()
for (let i = 0; i < data.results.length; i++) {
p = p.then(_ => template.instantiateToElement(data.results[i]).then(res => {
console.log('rendering');
}));
};
p.then(_ => {
console.log('done');
});
** template.instantiateToElement()返回promise
答案 0 :(得分:0)
您的问题是,到您调用instantiateToElement()
时,使用i
的循环已经完成,并且代码中看到的i
的唯一值是data.results.length
。>
您应该使用函数调用来绑定所需的i
值:
const instantiate = (i) => (_ => template.instantiateToElement(data.results[i]));
let p = Promise.resolve<void>();
for (let i = 0; i < data.results.length; i++) {
p = p.then(instantiate(i)).then(res => {
console.log('rendering');
}));
}
p.then(_ => {
console.log('done');
});
对instantiate(i)
的调用发生在for
循环期间,它创建了一个在新闭包中绑定了i
的函数。