通過在OpenUI5 code-base我碰到這個片段:Promise.resolve不帶參數的
// Wait until everything is rendered (parent height!) before reading/updating sizes.
// Use a promise to make sure
// to be executed before timeouts may be executed.
Promise.resolve().then(this._updateTableSizes.bind(this, true));
它看起來像native Promise function正在被使用,不帶參數傳遞給它的resolve
函數,它接受一個:
由此承諾解決的論點。也可以是承諾或 可以解決。
所以,因爲它看起來像承諾只會立即解決,並調用then
的回調,或許的意圖是similar to:
var self = this;
setTimeout(function() {
self._updateTableSizes.bind(self, true)
}, 0);
...基本上,釋放的JavaScript運行 - 實時事件循環來完成其他事情(如渲染),然後回到回調?
我的問題是:
這是一個常見的模式?最佳實踐?這兩種方法都有什麼優點/缺點?
我不知道答案,但我覺得你的猜測是正確的,即使用一個立即解決的承諾僅僅是如你所說,一個聰明的用法可以立即執行更新而不會超時。我不知道這種情況的最佳做法,但我經常使用'Promise.resolve()。then(...)'來確保捕獲在承諾鏈中使用的同步代碼中引發的錯誤,所以我不要認爲這是一個不好的選擇。 –
「等到所有東西都呈現」 - 如果這意味着根據瀏覽器觀察樣式變化進行渲染,Promise.resolve()。then(...)'是不夠的。據我所知,沒有辦法讓一個函數在渲染之後而在下一個任務之前運行。 –