無極

2016-04-15 42 views
0
的順序執行

我已經實現像無極

return new Promise(function(resolve, reject) { //logic }); 
  1. cart.getBasket(REQ)
  2. cart.updateBasket(REQ)
  3. cart.updateDefaultShipment(REQ)
  4. 以下承諾函數cart.getBasketObject(basket)

當前我執行co去使用

app.post('/Billing', function(req, res) { 
     cart.getBasket(req).then(function(basket) { 
      cart.updateBasket(req).then(function() { 
       cart.updateDefaultShipment(req).then(function(basket) { 
        cart.getBasketObject(basket).then(function(basketObj) { 
         res.render('billing', { 
          basket: basketObj 
         }); 
        }); 
       }); 
      }); 
     }).catch(function(error) { 
      console.log(error); 
     }); 
    }); 

我讀到Promise.each,並用它作爲我的邏輯流程的思想必須是連續的,但是當我用Promise.each預期這是行不通的,因爲我看到每一個承諾的是inner function of each回報價值執行。

app.post('/Billing', function(req, res) { 

     var asyncCalls = [cart.getBasket(req), cart.updateBasket(req), cart.updateDefaultShipment(req), cart.getBasketObject(basket)]; 
     Promise.each(asyncCalls, function(basketObj){ 
      res.render('billing', { 
       basket: basketObj 
      }); 
     }); 
    }); 

那麼,有沒有可以達到什麼樣的正與.then鏈即做有一個更清潔鏈中的任何清潔的方式。

另外,是否有可能在順序承諾執行中,下一個promise函數獲得之前執行的promise的返回值。

PS:Promise數組的長度會事先知道。

+0

http://bluebirdjs.com/docs/api/promise.reduce.html –

+0

爲什麼不讓扁平鏈條?應該不需要嵌套的承諾。 'cart.getBasket(req).then(cart.updateBasket.bind(undefined,req).then(cart.updateDefaultShipment.bind(undefined,req))''你不必使用綁定,也可以使用annon函數。 – ste2425

回答

2

您可以序列承諾不日益增長的嵌套這樣的:

app.post('/Billing', function(req, res) { 
    cart.getBasket(req).then(function(basket) { 
     return cart.updateBasket(req); 
    }).then(function() { 
     return cart.updateDefaultShipment(req); 
    }).then(function(basket) { 
     return cart.getBasketObject(basket); 
    }).then(function(basketObj) { 
     res.render('billing', {basket: basketObj}); 
    }).catch(function(error) { 
     console.log(error); 
    }); 
}); 

.then() autoamtically其連鎖於母公司的承諾,它允許您使用.then()處理父承諾,而不是返回一個承諾使用更深的嵌套來繼續序列。

這會自動將預先承諾的結果傳遞給下一個操作,但它不會將所有先前的結果傳遞給後續的承諾。如果您需要其他先前的結果,您可以在此處看到各種方法來執行此操作:How to chain and share prior results with Promises