這是來自使用 jest 的單元測驗檔案的片段。決議完成后,決議函式回傳一個承諾......但我無法理解該布爾標志(completedAsyncDummyTask)的使用。
it("parse is a promise that resolves with parser output", async () => {
const parser = new Parser();
let completedAsyncDummyTask = false;
setTimeout(() => {
completedAsyncDummyTask = true;
}, 0);
...
const test = await parser.parse(path.resolve(__dirname, "file.xyz"));
expect(completedAsyncDummyTask).toBe(true);
...
});
有任何想法嗎?
提前致謝。
uj5u.com熱心網友回復:
我無法想象測驗的目的是什么。我可以告訴你它在做什么,但不能告訴你為什么。
它檢查是否parser.parse(path.resolve(__dirname, "file.xyz"))履行了承諾,同時允許至少一個回圈通過主(“宏”)任務佇列,而不僅僅是在承諾履行所使用的微任務佇列中完成所有作業。
如果立即履行承諾,則主任務佇列在使用它的代碼運行之前永遠沒有機會await運行:
(async () => {
setTimeout(() => {
console.log("This comes second because it queues a macrotask");
}, 0);
await Promise.resolve();
console.log("This comes first because the promise fulfillment never allowed the macro task queue to be processed.");
})();
但如果不是,主任務佇列可能至少被處理一次,這使計時器回呼有機會設定變數。
測驗的存在表明應用程式中有一些依賴于該行為的代碼,這很奇怪。更奇怪的是,沒有評論解釋這種晦澀難懂的測驗。
您可能會想,既然Promise.resolve回傳了一個已履行的承諾,那么await根本不會做任何事情,并且代碼只是同步運行。這不是真的,即使等待一個已實作的承諾也需要至少延遲后續代碼直到微任務佇列回圈,正如我們在這里看到的:
顯示代碼片段
let run = true;
let ticks = 0;
(async () => {
while (run) {
await Promise.resolve();
ticks;
}
})();
(async () => {
setTimeout(() => {
console.log(`This comes second because it queues a macrotask`);
}, 0);
console.log(`Before: ticks = ${ticks}`);
await Promise.resolve();
console.log(`After: ticks = ${ticks}`);
console.log("This comes first because the promise fulfillment never allowed the macro task queue to be processed.");
run = false;
})();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476381.html
標籤:javascript 节点.js 开玩笑的
