Цепочка обещаний с задержкой не работает - PullRequest
0 голосов
/ 09 мая 2018

Мне нужно связать обещания друг с другом с задержкой между ними, но это не работает. Кажется, что все обещания выполняются одновременно.

Вот упрощенный пример, который не работает.

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 голосов
/ 09 мая 2018

Все они регистрируются одновременно, потому что вы всегда отделяете цепочку от базового обещания, 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}`);
    });
});
...