Javascript 有没有可能写上“我的名字?”;“真正的”;node.js中的异步函数

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

我一直在试图理解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;
        }
    }
}

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