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