Javascript Promise 对象无法与 Promise.all 异步工作

标签 javascript node.js asynchronous async-await

我有一个由续集 findAll 产生的 promise 对象,我尝试使用 map 循环数据但它不像我需要的那样工作。这是我的代码示例:

const list = await queueProcess.findAll({
    where: {
        id: {[Op.between]: [start, end]},
        is_active: true
    },
    attributes: ['id', 'param_value']
});

await Promise.all(
    list.map(async (e) => {
        console.log("Promise");
        const check = await checkProcess(e.id);
   })
)

这是另一个文件中的另一个函数:

checkProcess: async (id) =>{
    console.log("Check");
}

它给了我结果:

Promise
Promise
Check
Check

我需要的是

Promise
Check
Promise
Check

为什么会发生这种情况?我认为我的代码是合适的,并且可以异步工作。

最佳答案

每个 .map 回调都会立即并行运行 - list 中的每个项目都会导致 Promise 被记录,并且checkProcess 为每个调用。这里的 Promise 之间并不存在本质上的联系(直到它们解析,之后 Promise.all 会识别它并自行解析)。

如果您希望每次迭代在下一次迭代开始之前完全解析,请使用 for 循环进行串行处理,而不是使用 Promise.all(用于并行处理):

for (const e of list) {
  console.log('Promise');
  const check = await checkProcess(e.id);
}

关于Javascript Promise 对象无法与 Promise.all 异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60945860/

相关文章:

c# - 即使使用 ConfigureAwait(false),在 WebAPI 中同步调用异步方法也会死锁

javascript - 使用按钮编辑 UL 内的动态 LI

javascript - meteor upsert 返回错误

css - Gruntfile.js SASS 任务配置

javascript - 在回调 AngularJS ng-click 样式中执行 fn(param1, param2)

node.js <-> 带串口的 arduino。错误 资源暂时不可用 无法锁定端口

javascript - jasmine:在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时内未调用异步回调

javascript - 使用 create-react-app react ,不同的 env 文件

javascript - 我可以对 SVG <path> 使用 animate() 吗?

javascript - Axios Promise 到底什么时候解决