Javascript 有没有可能写上“我的名字?”;“真正的”;node.js中的异步函数
我一直在试图理解async/await关键字和承诺在NodeJs中是如何工作的。下面是我的测试代码:Javascript 有没有可能写上“我的名字?”;“真正的”;node.js中的异步函数,javascript,node.js,promise,Javascript,Node.js,Promise,我一直在试图理解async/await关键字和承诺在NodeJs中是如何工作的。下面是我的测试代码: function lowLevelFileReading() { for (let i = 0; i < 100000; i++) { for (j = 0; j < 100000; j++) { let lol = 5; lol = lol * lol + 2; } } } funct
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();
在我的电脑中,lowLevelFileReading()
大约需要25秒才能完成,所以我认为它适合测试一些长时间运行的操作
如上所述,slowPromise()
中的代码设置为1秒后启动,fastPromise()
中的代码设置为3秒后启动
我期待快速承诺在慢速承诺后2秒启动。但这并没有发生。您可以在控制台输出中看到,在慢承诺完成之前,快速承诺不会启动。请查看控制台日志的时间戳
我认为不可能用javascript实现我想做的事情。但我不明白“fs”库中的异步文件读取函数是如何工作的。我的意思是,fs.readFile()
的实现与我想象中的lowLevelFileReading()
实现有什么区别。node是否对某些“特殊”方法有不同的处理方式
我无法想象如何实现一个node.js服务器作为一个拥有数百万用户且操作耗时的网站的后端。你能提供一些见解吗?快速免责声明:我刚刚读了这篇文章,可能解释得有点错误 问题是Node.js通常运行单线程。但是,当运行某种非javascript操作时,它可以将其“外包”并使其在内核上并行运行。但是,在您的例子中,如果有一个像
lowLevelFileRead
这样的函数,它不运行任何类型的I/O操作,那么它将阻止其他代码的执行
以下是我发现的一篇文章,可能有助于解释一些事情:
对于您的代码版本,在lowLevelFileReading()完成之前,fast promise仍然不会启动。这并不能解决
lowLevelFileReading
函数速度慢且阻塞的问题,它只是在解析promise之前运行该速度慢且阻塞的函数之后增加了一个延迟。“将其放入超时使其异步运行。“-不,没有。它只是让它在3秒钟后运行。它仍然是缓慢和阻塞。其他东西可以在它之前运行,但不能与它同时运行。但是快速承诺在读取操作之前开始运行快速承诺不是重点,关键是lowLevelFileReading
在运行时会阻塞所有其他内容,而不管这可能是什么时候。承诺可以说是并发运行的,而不是并行运行的。Javascript是单线程的,lowLevelFileReading
会阻止执行,直到完成为止。你可能想调查一下你是否有一个真正昂贵的计算任务。
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