2016-08-25 58 views
3

雖然工作在我的web應用程序,特別是文件上傳,瀏覽器顯示一個警告後,我打電話給一個警告:鉻:調用「警報()」 microtask執行過程中已被廢棄,都將被刪除

調用「警報()'在執行微任務時已棄用,並將在2016年9月左右的M53中刪除。有關更多詳細信息,請參閱https://www.chromestatus.com/features/5647113010544640

但是我認爲在我的情況下,調用是有道理的,我有點擔心,一旦M53發佈,我的代碼就無法工作。請注意,我沒有將警報發送到生產環境,但對於測試它非常有價值。

的情況:

我使用的反應開發我的應用程序中的打字稿。我使用axios來執行http請求。基本上,HTTP-POST看起來是這樣的:

axios.post("/upload/", data) 
    .then((response: any) => { 
     callback(undefined); 
    }) 
    .catch((error: any) => { 
     callback(error); 
    }); 

然後在調用方法,我彈出一個警告,如果有一個錯誤,所以我可以肯定的是測試/開發者將會收到通知。有點像這樣:

this.service.uploadFile((error: any) => { 
    if (error) { 
     console.log(error); 
     alert("An error occured"); 
     return; 
    } 

    this.onUploadCompleted() 
}); 

這是當鉻顯示警告。

首先,我想知道警告是否合理,因爲直到請求完成並返回錯誤後才顯示警報。所以我很確定它沒有阻塞任何東西。

如果有道理,可以做些什麼以便我可以顯示警報?

+1

「console.log()」不夠嗎? –

回答

11

是的,警告是有道理的:您在一個微任務中調用alert,在這種情況下,承諾完成。 (見Difference between microtask and macrotask within an event loop context。)

alertpromptconfirm是一個時代早已過去的遺蹟,他們有一個問題:他們完全中斷的JavaScript的正常運作,可以說是被完全中止違反其運行至完成語義執行,就在作業隊列中的作業中(或來自事件循環的任務; JavaScript和HTML5規範在術語上有所不同),並以阻止模式的形式進行UI。這不符合基於事件的一般交互模式(顯示消息,當它關閉時得到一個事件)。

你可以解決它做在宏觀任務,而不是alert

this.service.uploadFile((error: any) => { 
    if (error) { 
     setTimeout(() => { 
      console.log(error); 
      alert("An error occured"); 
     }, 0); 
     return; 
    } 

    this.onUploadCompleted() 
}); 

...但真正的解決辦法是停止使用alertpromptconfirm完全。


這裏的微觀和宏觀的任務一個有趣的例子:一個承諾完成是microtask,而計時器回調是宏任務。腳本的初始運行也是一個macrotask。所有由macrotask排隊的微任務在之前運行,下一個宏任務運行;例如,他們跳過隊列。所以用這個:

// First, we set a timer callback for 0ms 
 
setTimeout(() => { 
 
    console.log("timer fired"); 
 
}, 0); 
 

 
// Now we get a promise that's *already* resolved and hook a callback 
 
Promise.resolve().then(() => { 
 
    console.log("promise resolved"); 
 
}); 
 

 
// Now show a message demonstrating we got here before the promise resolution callback 
 
console.log("got to the end");

...我們看到

 
got to the end 
promise resolved 
timer fired 

...而不是

 
got to the end 
timer fired 
promise resolved 

....我們會得到如果所有任務都是平等的。

相關問題