javascript - 阐明非阻塞异步的代码示例。代码 - 是否正确?
问题描述
我试图理解异步代码,所以我编写了以下示例。它采用使用 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');
解决方案
您在那里所做的唯一一件事就是将散列函数延迟一个微任务——它甚至可能不会被推迟到下一个事件循环。
一旦它开始执行,它将在执行期间阻塞事件循环,因为JavaScript 是单线程的。解决这个问题的唯一方法是使用工作线程将处理负载放在另一个线程上。
推荐阅读
- jenkins - Jenkins 无法创建 kubernetes POD
- json - 使用 JQ 从 JSON 中检索列表项具有特定/已知值的数据
- python-3.x - 在 pyspark 中使用 foreach()
- typescript - Typescript: Specify multiple possible values for a key in an interface
- prometheus - Prometheus 中合成序列的条件规则
- java - Formatting LocalDate in Java
- android - Gson 字符串中是否有要在 SharedPreferences 中存档的最大长度?
- java - Java 日期格式来自 yyyy-MM-dd'T'HH:mm:ss.SSS+ZZZZ
- email - 抄送和密送不工作,我收到错误“无效的电子邮件:[L ;@34c5bdeb”
- spring - 我正在使用 Spring、Hibernate 和 h2 构建电子商务网站。我收到此错误