承諾中的回圈就像同步代碼一樣作業,例如:
console.log('im working')
function proLoop(){
return new Promise((resolve ,rejects)=>{
for (let i = 0; i < 1000000000000; i ) {}
console.log('loop is done')
})
}
proLoop();
console.log('im working')
因此,即使我們像 Promise 一樣撰寫代碼,它也會獲得更多時間并凍結我們的代碼。換句話說,它會同步作業。
我找到了解決方案,但為什么它有效?
所以解決方案只是像已解決的承諾一樣扭曲您的代碼
像這樣
return Promise.resolve().then( ()=>{
for (let i = 0; i < 1000000000000; i ) {}
console.log('loop is done')
})
但為什么以及如何???
uj5u.com熱心網友回復:
您需要在這里了解幾件事:
Promise 不會使某些東西異步——它們是已經異步的東西的通知機制。Promise 會通知您已經異步的操作的成功或失敗。
同步呼叫promise建構式的回呼函式;它被同步呼叫以啟動已經異步的操作。
在您的情況下,promise 建構式包含同步代碼;這就是它阻止其他代碼的原因。
將回圈移動到回呼函式內部會
then異步執行回圈,因為回呼函式then是異步呼叫的。注意:雖然
then方法的回呼函式是異步呼叫的,但一旦開始執行,直到回呼內部的同步代碼執行完畢后,才會執行其他代碼。
uj5u.com熱心網友回復:
在這兩種情況下,for回圈都會阻塞主事件回圈。不同之處在于for回圈何時開始。
在第一種情況下,傳遞給的函式會立即new Promise執行。因此,它會阻止創建它的其余函式。
在第二種情況下,傳遞給的函式then()排隊等待下次事件回圈空閑時運行。因此,創建它的函式首先完成,然后for回圈運行。(如果這是目標,那么它是一種非常不直觀的方法,并且使用setImmediate(在瀏覽器中)或 Nodeprocess.nextTick()會更整潔。)
如果您想將for回圈完成的作業從主事件回圈中分流出去,這樣它就不會阻塞任何事情,您可以使用Web Worker或Worker 執行緒,具體取決于您使用的 JavaScript 運行時。
uj5u.com熱心網友回復:
executor function inside Promise在 Promise 物件回傳之前同步呼叫。這就是回圈在最后一行之前執行的原因。
請看下面的例子。
Promise.resolve("line 1").then(res => console.log(res));
console.log("line 2");
new Promise((resolve, rejects) => {
console.log("line 3: inside executor");
});
console.log("line 4");
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432740.html
標籤:javascript 循环 for循环 承诺 es6-承诺
上一篇:專案未正確附加
