2017-04-23 88 views
0

承諾解決後,我們可以使用.then方法,它什麼時候運行?它解決後立即運行嗎?例如,在下面的例子中,一旦Javascript出現,promise就會「準備就緒」,儀式?沒有什麼大事。由於承諾中沒有大的計算,爲什麼.then方法在其他所有方面都運行?由於Javascript - 一旦解決了承諾的結果,何時可用?

let $body = $('#mainBlock'); 
let checker = true; 

let testPromise = new Promise(
    function(resolve, reject) 
    { 
     if(checker) 
     { 
      resolve(); 
      $body.append('<p>CodeHasFinished</p>'); 
     } 
    } 
); 




$body.append('<p>before</p>'); 

testPromise.then(function(){ 
    $body.append('<p>middle</p>'); 
}); 

$body.append('<p>after</p>'); 

/* 

Result added to body-> 
CodeHasFinished 
before 
after 
middle 

*/ 
+0

'。那麼()'不保證返回結果同步 – guest271314

+0

我應該假設{}。那麼一切都將運行後其他?謝謝 –

+1

儘量不要「承擔」任何事情,在這裏。如果你想使用'Promise'鏈,鏈'.then()'和'.catch()'並且在傳遞給'.then()'和'.catch()'的函數中執行任務。如果你想使用同步代碼,使用同步代碼。你爲什麼試圖同步異步代碼的同步代碼?你想達到什麼目的? – guest271314

回答

2

按照Promises/A+ spec

2.2.4。在執行上下文堆棧僅包含平臺代碼之前,不能調用onFulfilled或onRejected。 [3.1]

注3.1狀態

這裏「平臺代碼」是指發動機,環境和承諾的實現代碼。在實踐中,這一要求確保onFulfilled和onRejected執行異步,在事件發生後循環依次然後叫,並用新的堆棧....

所以,從某種意義上說你的評論說。然後將運行 「一切之後」 是一個好的假設

考慮下面的代碼

let i = 0; 
 
console.log('a', ++i); 
 
Promise.resolve().then(() => console.log('e', ++i)).then(() => console.log('h', ++i)).then(() => console.log('j', ++i)); 
 
console.log('b', ++i); 
 
Promise.resolve().then(() => console.log('f', ++i)).then(() => console.log('i', ++i)); 
 
console.log('c', ++i); 
 
Promise.resolve().then(() => console.log('g', ++i)); 
 
console.log('d', ++i);

我可以肯定的是,控制檯輸出將是

  • B 2
  • ...
  • J,10卷

需要明確的是,如果這些之一.then函數內部有異步代碼(返回一個Promise),該序列將而不是被簡單地預測 - 我只是在展示你R「假設」 - 那.then一切後,將運行 - 實際上是相當合理的一個