在承诺数组之间添加延迟
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();
});
我在执行 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();
});