在承诺数组之间添加延迟

Add delay between array of promises

我在执行 Promise 之间添加延迟时遇到了麻烦。我希望它们按特定顺序执行。我已经尝试 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));

如果你想 运行 按顺序执行 Promise,你需要延迟它们的执行。你可以通过让你的数组 return 成为一个函数,然后 returns 一个 Promise 并将其传递给 mapSeries:

const arr = [
    () => Promise.resolve(1) /* () => accept(user.id, admin.id) */,
    () => Promise.resolve(2) /* () => accept(user.id, employee.id) */,
    () => Promise.resolve(3) /* () => reject(user.id, employee.id) */
];
// Now use mapSeries to execute the promises in sequence
Promise.mapSeries(arr, item => {
 return Promise.delay(1000).then(item);
})
.then(arr => console.log(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.4.1/bluebird.js"></script>

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();
});