延迟的承诺链不起作用

时间:2018-05-09 17:32:58

标签: javascript node.js delay es6-promise chaining

我需要在两者之间延迟连接承诺,但它不起作用。所有承诺似乎都在同时解决。

这是一个似乎不起作用的简化示例。

function delayPromise() {
    const delay = 500;
    return new Promise(function(resolve, reject){
        setTimeout(resolve, 1000);
    });
}

const data = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
const promiseChain = Promise.resolve();

data.forEach(function(datum) {
    promiseChain
    .then(delayPromise)
    .then(delayPromise)
    .then(function(){
        // all of these are logged at the same time!
        console.log(`Datum logged: ${datum}`);
    });
});

由于

1 个答案:

答案 0 :(得分:4)

它们都是同时记录的,因为您总是链接基础承诺promiseChain,而不重新分配它。也就是说,由于您从未重新分配该值,因此您始终从同一Promise.resolve开始新的链。

要更改此设置,只需确保使用您设置的promiseChain链中的新承诺重置.then变量。 EG:

promiseChain = promiseChain
    .then(delayPromise)
    // ... so on

确保使用promiseChain声明let或不起作用

以下是修复此示例的示例。请注意,现在它们都记录了每个之间的延迟:

function delayPromise() {
    const delay = 500;
    return new Promise(function(resolve, reject){
        setTimeout(resolve, 1000);
    });
}

const data = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
let promiseChain = Promise.resolve();

data.forEach(function(datum) {
    promiseChain = promiseChain
    .then(delayPromise)
    .then(delayPromise)
    .then(function(){
        // These are all logged with a delay between each!
        console.log(`Datum logged: ${datum}`);
    });
});