首页 > 解决方案 > NodeJS - 与承诺的异步 - 没有按预期工作

问题描述

对于以下代码,我希望每个 Promise 都能启动并运行。我不希望在代码结束之前等待承诺,但由于某种原因,每个操作都是同步运行的。为什么是这样?我只是做错了什么吗?

#!/usr/bin/env node

const longRunningOperation = async (index) =>{
    console.log("Starting Operation " + index.toString())
    console.time(index)
    const cap = 5_000_000_000;
    let sum = 0
    for(let i = 0; i < cap; i++) sum+=i
    console.timeEnd(index)
}

const op1 = longRunningOperation(1);
const op2 = longRunningOperation(2);
const op3 = longRunningOperation(3);
const op4 = longRunningOperation(4);

console.log("Hi! I run before anything else. Right?")

await Promise.all([op1, op2, op3, op4])

实际结果:

Starting Operation 1
1: 4.336s
Starting Operation 2
2: 4.740s
Starting Operation 3
3: 11.830s
Starting Operation 4
4: 11.675s
Hi! I run before anything else. Right?

预期结果(当然时间不同):

Hi! I run before anything else. Right?
Starting Operation 1
Starting Operation 2
Starting Operation 3
Starting Operation 4
1: 4.336s
2: 4.740s
3: 11.830s
4: 11.675s

标签: javascriptnode.jsasynchronousasync-await

解决方案


@VLAZ 所暗示的是正确的道路。Promise在事件循环中生成一个Task对象。这是一个同步操作。当这个 Promise 被创建时,事件堆栈是空的,因此任务被赋予了运行时间。

重要的是要注意,尽管是异步的,但这并不意味着该函数是在单独的线程上执行或并行执行的。异步,简单的说是在有时间的时候执行操作。因此,由于堆栈上没有其他内容出现,因此存在,因此执行该函数。


推荐阅读