按顺序运行承诺循环并等待执行完成

时间:2018-11-21 15:13:18

标签: typescript promise

我正在尝试运行一个循环,其中为每次迭代创建一个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

1 个答案:

答案 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的函数。