【发布时间】:2022-02-17 16:09:38
【问题描述】:
我必须继续调用 SERVICE_PATH,直到响应中的报告准备好。
显然,由于使用了“do/while”,下面的代码被阻塞了。
那么,问题是如何重构代码以使其成为非阻塞的?
let scoring_report;
let timeout_count = 1;
let getReport;
do {
await new Promise((resolve) => setTimeout(resolve, timeout_count * 1000));
getReport = await axios.post(`${process.env.SERVICE_PATH}:8001`, {body});
scoring_report = getReport.data.data.reportBase64;
timeout_count += 2;
} while (!scoring_report);
【问题讨论】:
-
最好使用工作线程或一些调度程序在 N 分钟/秒内执行一次
-
"显然,由于使用了"do/while"",下面的代码被阻塞了。不,不是。
-
@Kaiido 我认为JS代码通常负责阻塞,因为主线程很忙,并且在主线程计算时不要让事件循环干扰。能详细点吗?
-
好吧,你的异步函数被
await关键字暂停,它只会在它等待的 Promise 解决时恢复,并且只有在执行超时回调后才会发生。在这两者之间,这个脚本不会做任何事情,也不会让事件循环保持忙碌。 -
@Kaiido 我明白了,但在我的情况下,do/while 取决于 score_report,它是 POST 请求(getReport)的响应。因此,do/while 使主线程保持忙碌,而异步请求(getReport)继续调用,直到它收到具有“reportBase64”的响应。这就是为什么我认为 do/while 是阻塞的。我在这里误解了什么吗?
标签: javascript node.js nonblocking event-loop