我需要在两者之间延迟连接承诺,但它不起作用。所有承诺似乎都在同时解决。
这是一个似乎不起作用的简化示例。
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}`);
});
});
由于
答案 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}`);
});
});