2017-01-02 61 views
1

從來就從不同的來源,從來就學習的Javascript遇到的代碼塊:的Javascript無極

function waitForUI() { 
    return new Promise(function (resolve) { 
    display.getBoundingClientRect(); 
    requestAnimationFrame(function() { 
     requestAnimationFrame(resolve); 
     }); 
    }); 
} 

從什麼從來就明白,承諾對象可以解決或拒絕,這取決於哪一個會發生不同的事情。但在這種情況下,承諾只有解決,意味着它永遠不會被拒絕?然後在這個功能裏面有一個孩子的承諾,只有解決了。如果這個承諾總是要經過的話,那麼這個承諾有什麼意義呢?

我不完全確定這個功能是如何工作的,所以如果有人能給我一個提示,我會非常感激,我一直在想它,但一直沒有得到一個好的答案。

乾杯

回答

2

首先是關於孩子的承諾。我想你的意思是這樣的:

requestAnimationFrame(function() { 
    //.... 
}); 

這其實不是一個真正的承諾,但一個(更鹼)的回調實現,什麼時間完成時調用。在這種情況下,當下一次塗料循環發生時。不要驚訝resolve可以從該回調中調用。沒有規定說你不能這麼做:resolve仍然在該功能範圍內。

在回調中再次調用​​的原因是爲了確保重繪已經發生,當您等待2個週期時,這是肯定的。然後調用resolve

然後就是拒絕承諾。是的,即使這個承諾可以被拒絕,因爲該參數按承諾內部通過,並在必要時,你可以利用它:

return new Promise(function (resolve, reject) { // added reject 
    display.getBoundingClientRect(); 
    if (somecondition) { // whatever error condition you might have 
     reject(); 
    } else { 
     requestAnimationFrame(function() { 
      requestAnimationFrame(resolve); 
     }); 
    } 
}); 
+0

好that's完美的,我現在該怎麼理解它作品。非常感謝trincot(對不起,我沒有聲望給答案+1)。 – MrRobot0150

+0

不客氣;-) – trincot

0

但在這種情況下,承諾只已經解決,意義它永遠不會被拒絕?

是的,這個承諾總會得到滿足。

再有就是在函數內部一個孩子的承諾,只有同時解決...

沒有,沒有「孩子的承諾」。我假設你參考requestAnimationFrame(resolve);?這只是將resolve函數(從new Promise構造函數中收到)作爲回調函數傳遞給​​。

如果承諾總是要經過,那麼承諾有什麼意義呢?

承諾的main purpose是不是他們的錯誤和成功案例進行區分,但他們這樣做異步。發生這種事情並不那麼重要,但當發生時

1:除非它不不會發生
2:其實它也將被拒絕,如果display.getBoundingClientRect()或外requestAnimationFrame(…)將拋出一個同步異常

+0

但是,它代表的代碼與簡單的'requestAnimationFrame(resolve)'有什麼不同? – 2017-01-02 14:36:32

+0

你的意思是兩個嵌套'requestAnimationFrame's?我不知道,但可能是在事件隊列結束時得到解決的承諾,或等到至少一幀後才能解決。 – Bergi