【发布时间】:2021-04-04 20:42:15
【问题描述】:
我一直在尝试了解 async/await 关键字和 Promise 在 NodeJs 中是如何工作的。下面是我的测试代码:
function lowLevelFileReading() {
for (let i = 0; i < 100000; i++) {
for (j = 0; j < 100000; j++) {
let lol = 5;
lol = lol * lol + 2;
}
}
}
function slowPromise() {
return new Promise(resolve => {
setTimeout(() => {
console.log("starting slow promise " + new Date())
lowLevelFileReading();
resolve("slow");
console.log("slow promise is done " + new Date())
}, 1000);
})
}
function fastPromise() {
return new Promise(resolve => {
setTimeout(() => {
console.log("starting fast promise" + new Date())
resolve("fast")
console.log("fast promise is done" + new Date())
}, 3000);
})
}
async function parallel() {
// Start 2 "jobs" in parallel and wait for both of them to complete
await Promise.all([
(async()=>console.log(await slowPromise()))(),
(async()=>console.log(await fastPromise()))()
])
}
parallel();
这是我的控制台输出:
starting slow promise Sun Apr 04 2021 10:41:30 GMT+0300 (GMT+03:00)
slow promise is done Sun Apr 04 2021 10:41:54 GMT+0300 (GMT+03:00)
slow
starting fast promiseSun Apr 04 2021 10:41:54 GMT+0300 (GMT+03:00)
fast promise is doneSun Apr 04 2021 10:41:54 GMT+0300 (GMT+03:00)
fast
在我的电脑中,lowLevelFileReading() 大约需要 25 秒才能完成,所以我认为它适合测试一些长时间运行的操作。
如上图所示,slowPromise() 中的代码设置为 1 秒后启动,fastPromise() 中的代码设置为 3 秒后启动。
我预计快速承诺会在慢速承诺后 2 秒开始。但它没有发生。您可以在控制台输出中看到,在慢速承诺完全完成之前,快速承诺不会启动。请查看控制台日志的时间戳。
我认为用 javascript 做我想做的事情是不可能的。但是后来我不明白“fs”库中的异步文件读取功能是如何工作的。我的意思是,fs.readFile() 的实现和我想象中的lowLevelFileReading() 实现有什么区别。节点对某些“特殊”方法的处理方式不同吗?
我无法想象如何将 node.js 服务器用作具有数百万用户且操作耗时的网站的后端。您能否提供一些见解?
【问题讨论】:
-
Promise 可以说是并发运行的——不是并行的。 Javascript 是单线程的,
lowLevelFileReading会阻塞执行,直到它完成。如果您有一项真正需要大量计算的任务,您可能需要查看Workers。
标签: javascript node.js promise