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吗?