下面的代碼掛在Firefox和Chrome,但不是在邊緣:是promise.then異步或不?
let sequence = Promise.resolve();
function fire() {
sequence.then(fire)
};
fire();
我認爲它沒有在Firefox掛了幾個版本前,我很困惑。這裏的正確行爲是什麼?
編輯:邊緣37.14316現在掛起。
下面的代碼掛在Firefox和Chrome,但不是在邊緣:是promise.then異步或不?
let sequence = Promise.resolve();
function fire() {
sequence.then(fire)
};
fire();
我認爲它沒有在Firefox掛了幾個版本前,我很困惑。這裏的正確行爲是什麼?
編輯:邊緣37.14316現在掛起。
它掛起,因爲.then
鏈在微任務隊列上執行,不像例如。 setTimeout
其執行主JavaScript事件隊列:
let sequence = Promise.resolve();
function fire() {
setTimeout(fire); // doesn't hang
};
fire();
大多數瀏覽器清空microtask隊列中完全處於當前運行至完成的尾巴,你的代碼阻止它曾經排空,拖延主要JavaScript事件隊列。
瀏覽器並未完全掛起,因爲用戶可能會在一段時間後停止此失控腳本。瀏覽器在此期間的感覺如何,取決於瀏覽器是否支持多個進程。例如。由於開發版使用多個進程,所以Firefox開發者版在這裏的表現要好於Firefox。
是,Promise.then
是異步,但是當你解決的承諾向右走,然後繼續調用回調內部相同的功能,你會得到一個無限循環,並在瀏覽器掛起
簡單來說,你」重新做
function fire() {
fire(); // goes on forever
}
fire();
唯一的區別是fire
是一個已經解決了異步回調,以及火災的時候了。
如果Edge沒有掛起,那只是因爲它可以更好地處理遞歸。
正確的做法是掛。你不會得到堆棧溢出,但異步無限遞歸仍然是無限遞歸。
1:這是microtask隊列中的一個無限循環。其他承諾工作可能會運行,但沒有其他的。
什麼是預期行爲,結果? – guest271314
可能只是一個自動武器開火永遠 – maksymiuk
順便說一句,你的意思是'序列= sequence.then(火)'? – Bergi