Javascript 在承诺数组之间添加延迟
我遇到了麻烦,在履行承诺之间增加了延迟。我希望它们按照特定的顺序执行。我尝试了Javascript 在承诺数组之间添加延迟,javascript,node.js,ecmascript-6,bluebird,Javascript,Node.js,Ecmascript 6,Bluebird,我遇到了麻烦,在履行承诺之间增加了延迟。我希望它们按照特定的顺序执行。我尝试了Promise.mapSeries,但没有成功 我的工作代码当前看起来像: await Promise.delay(1000); await accept(user.id, admin.id); await Promise.delay(1000); await accept(user.id, employee.id); await Promise.delay(1000); await reject(user.id, e
Promise.mapSeries
,但没有成功
我的工作代码当前看起来像:
await Promise.delay(1000);
await accept(user.id, admin.id);
await Promise.delay(1000);
await accept(user.id, employee.id);
await Promise.delay(1000);
await reject(user.id, employee.id);
我尝试了Promise.mapSeries
但没有成功:
const promises = [
accept(user.id, admin.id),
accept(user.id, employee.id),
reject(user.id, employee.id)
];
await Promise.mapSeries(promises, () => Promise.delay(1000));
如果您希望按顺序运行承诺,则需要延迟其执行。通过使数组返回一个函数,该函数返回一个承诺,并将其传递给
mapSeries
:
const arr=[
()=>Promise.resolve(1)/*()=>accept(user.id,admin.id)*/,,
()=>承诺.解决(2)/*()=>接受(user.id,employee.id)*/,,
()=>承诺.解决(3)/*()=>拒绝(user.id,employee.id)*/
];
//现在使用mapSeries按顺序执行承诺
Promise.mapSeries(arr,项目=>{
返回承诺。延迟(1000)。然后(项目);
})
.然后(arr=>console.log(arr))代码>
如果要按顺序运行承诺,则需要延迟其执行。通过使数组返回一个函数,该函数返回一个承诺,并将其传递给mapSeries
:
const arr=[
()=>Promise.resolve(1)/*()=>accept(user.id,admin.id)*/,,
()=>承诺.解决(2)/*()=>接受(user.id,employee.id)*/,,
()=>承诺.解决(3)/*()=>拒绝(user.id,employee.id)*/
];
//现在使用mapSeries按顺序执行承诺
Promise.mapSeries(arr,项目=>{
返回承诺。延迟(1000)。然后(项目);
})
.然后(arr=>console.log(arr))代码>
mapSeries
在您已经有一系列承诺的情况下没有帮助。构建数组并创建承诺已经开始了操作,这些操作将并行运行,而不是按顺序运行
最简单的解决方案是一个简单的循环:
const actions = [
{ action: accept, target: user, source: admin },
{ action: accept, target: user, source: employee },
{ action: reject, target: user, source: employee }
]
for (const a of actions) {
await Promise.delay(1000);
await a.action(a.target.id, a.source.id);
}
但您也可以使用mapSeries
,而不是:
await Promise.mapSeries(actions, a =>
Promise.delay(1000)
.then(() => a.action(a.target.id, a.source.id))
);
如果您的行为更具异质性,只需让它们发挥作用:
const actions = [
() => accept(user.id, admin.id),
() => accept(user.id, employee.id),
() => reject(user.id, employee.id)
];
for (const f of actions) {
await Promise.delay(1000);
await f()
}
await Promise.mapSeries(actions, async f => {
await Promise.delay(1000);
return f();
});
mapSeries
在您已经有一系列承诺的情况下没有帮助。构建数组并创建承诺已经开始了操作,这些操作将并行运行,而不是按顺序运行
最简单的解决方案是一个简单的循环:
const actions = [
{ action: accept, target: user, source: admin },
{ action: accept, target: user, source: employee },
{ action: reject, target: user, source: employee }
]
for (const a of actions) {
await Promise.delay(1000);
await a.action(a.target.id, a.source.id);
}
但您也可以使用mapSeries
,而不是:
await Promise.mapSeries(actions, a =>
Promise.delay(1000)
.then(() => a.action(a.target.id, a.source.id))
);
如果您的行为更具异质性,只需让它们发挥作用:
const actions = [
() => accept(user.id, admin.id),
() => accept(user.id, employee.id),
() => reject(user.id, employee.id)
];
for (const f of actions) {
await Promise.delay(1000);
await f()
}
await Promise.mapSeries(actions, async f => {
await Promise.delay(1000);
return f();
});
await
不完全是ES6吗?await
不完全是ES6吗?