2017-05-03 170 views
0

我試圖瞭解承諾如何工作,但我不明白爲什麼我需要按下我的按鈕超過這個承諾鏈工作幾次。鏈接多個承諾

  1. 第一個函數創建新用戶並返回一個承諾。
  2. 如果用戶有車,則更新其他系統。
  3. 第三個應該在收到車號時更新用戶對象。

當我只按下按鈕CreateUser被解僱。如果我再次按下按鈕,它也會觸發UpdateModel

CreateUser(newUser).then((userObject) => { 
     if(userObject.car) { 
      UpdateModel(userObject.objectId, userObject.car).then((carId) => { 
       userObject.car = carId; 
       UpdateUser(userObject).then((updatedUser) => { 
        this.moveNextPage(updatedUser); 
       }); 
      }, (error) => { 
       console.log(error); 
      }); 
     } else { 
      this.moveNextPage(userObject); 
     }  
    }, (error) => { 
     console.log(error); 
    }) 
+0

你不會返回傳遞給'.then()'的函數的promise,所以promise * it *返回的promise不會等待任何東西。 – Ryan

+0

雖然嵌套承諾是此代碼中的一個問題,但真正的問題可能在於處理按鈕點擊的代碼,而這不在此處。 – Joseph

+0

[我如何訪問以前的承諾導致.then()鏈可能重複?](http://stackoverflow.com/questions/28250680/how-do-i-access-previous-promise-results-in- a-then-chain) –

回答

0

你試圖完成的事情很難承諾。我將承擔不直接回答您的問題的風險,但會間接回答並幫助您解決與工作流相關的所有類似問題。打個招呼吧async library

這個庫旨在解決所謂的「回調地獄」,你現在正面臨着這個問題。例如,從同步編程背景來看,認爲我們可以將函數的輸出用作下一個函數的輸入是很自然的。異步,瀑布完全符合我們的要求,隱藏回調地獄結構(感謝上帝)。因此,對於你的問題的解決方案會簡單地把你的功能,在這種結構中(從異步複製的文件):

async.waterfall([ 
    function(callback) { 
     callback(null, 'one', 'two'); 
    }, 
    function(arg1, arg2, callback) { 
     // arg1 now equals 'one' and arg2 now equals 'two' 
     callback(null, 'three'); 
    }, 
    function(arg1, callback) { 
     // arg1 now equals 'three' 
     callback(null, 'done'); 
    } 
], function (err, result) { 
    // result now equals 'done' 
}); 

所以,這讓你感覺幾乎一樣回到同步的語言!如果您需要並行或串行執行函數(不使用前一個函數的函數),則可以使用async.parallel或async.each。還有很多其他功能。

正如我所說,這是一個解決您的問題的答案,但不完全符合您的要求。如果你對這些鏈式回調的內部運作情況感到好奇,請忽略我的回答。

乾杯和祝你好運!