首页 > 解决方案 > 阐明非阻塞异步的代码示例。代码 - 是否正确?

问题描述

我试图理解异步代码,所以我编写了以下示例。它采用使用 node.js 加密模块的同步散列算法并将其插入到 promise 中,希望这不会阻塞。

以下代码是否在事件循环之外运行?我相信它会在微任务队列中排队?

从下面的示例代码中,将出现以下输出:

hello
hello2
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

这向我表明它是非阻塞的,因为 hello2 出现在哈希函数的输出之前,但我想与社区一起检查以确保我正确理解事物。

const crypto = require('crypto');

async function hash(data) {
        let p = new Promise((resolve, reject) => {
                const algo = crypto.createHash('sha256');
                const upd = algo.update(data);
                const digest = upd.digest('hex');
                resolve(digest);
        }).catch(err => console.log(err));

        console.log(await p);
}

console.log('test1');
hash('hello');
console.log('test2');

标签: javascriptnode.js

解决方案


您在那里所做的唯一一件事就是将散列函数延迟一个微任务——它甚至可能不会被推迟到下一个事件循环。

一旦它开始执行,它将执行期间阻塞事件循环,因为JavaScript 是单线程的。解决这个问题的唯一方法是使用工作线程将处理负载放在另一个线程上。


推荐阅读