2016-05-31 60 views
0

我正在使用Typescript編寫JS承諾。我有一個化合物承諾,即許它返回一個承諾 我有:確保在複合承諾中執行異常'.then()'

test() { 
    addElement("first") 
     .then(
      function (val){ 
       addElement("second"); 
       console.log("second*); 
      }) 
      .then(
      function (val){ 
       addElement("third"); 
       console.log("third*"); 
      }); 
} 


export function addElement(elementText){ 
    return new Promise(function(resolve,reject){ 
     setTimeout(function(){ 
      resolve(); 
     }, Math.random() * 2000); 
    }) 
    .then(console.log(elementText)); 
} 

我想這些功能打印出,first, second*, second, third*, third。不過,我得到:

JS:第一 JS:第二* JS:第三* JS:第三 JS:第二

如何獲得then被叫承諾後執行'then已完成?

+0

通過設計,Promises在事件循環的下一次迭代中得到解決。 – zerkms

+0

@zerkms有沒有辦法執行一些代碼後,所有的addElement邏輯執行?像onCompletion事件? –

+0

你可以使用Promise.all()來計算執行順序。 –

回答

0

您不是返回您在then區塊的承諾。如果你沒有退還承諾,那麼立即then塊將return undefined,並沒有什麼會等待它。如果您返回承諾,那麼承諾鏈的執行將會暫停,直到您返回的承諾得到滿足。

test() { 
    addElement("first") 
     .then(
      function (val){ 
       console.log("second*"); 
       return addElement("second"); 
      }) 
      .then(
      function (val){ 
       console.log("third*"); 
       return addElement("third"); 
      }); 
} 

雖然我個人並不認爲這是一個「新手的錯誤」,你的描述相符「新手的錯誤#5」的諾蘭勞森的「We have a problem with promises」;閱讀更深入的解釋。