javascript - 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
解决方案
@VLAZ 所暗示的是正确的道路。Promise在事件循环中生成一个Task对象。这是一个同步操作。当这个 Promise 被创建时,事件堆栈是空的,因此任务被赋予了运行时间。
重要的是要注意,尽管是异步的,但这并不意味着该函数是在单独的线程上执行或并行执行的。异步,简单的说是在有时间的时候执行操作。因此,由于堆栈上没有其他内容出现,因此存在,因此执行该函数。
推荐阅读
- c++ - FLTK图片不显示
- javascript - 如何更好地优化 Nodejs/Oracledb 环境的可用性、安全性和速度?
- scrapy - 如何将抓取的数据从 Scrapy 存储到 FTP 为 csv?
- azure - 在 Pipeline Azure 中发布 PHPUnit 代码覆盖率结果
- python - 主题建模错误(doc2bow 需要输入的 unicode 标记数组,而不是单个字符串)
- linux - Ansible 输出到文件
- html - 居中 CSS X 按钮
- git - 当文件从一个分支检出到另一个分支时,Github UI 似乎没有跟踪分支之间的差异
- r - 除变量外具有叠加因子的 PCA
- python-3.x - 使用下一行值作为条件