2016-04-15 1 views
0

J'ai fonctions suivantes promesse mises en application commeexécution séquentielle de Promise

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

Actuellement j'exécute co de l'aide

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); 
     }); 
    }); 

Je l'ai lu Promise.each et de la pensée de l'utiliser comme le flux de ma logique doit être séquentielle, mais quand je l'utilise Promise.each ne fonctionne pas comme prévu parce que je voyais que la valeur inner function of each de retour de toutes les promesses exécution.

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 
      }); 
     }); 
    }); 

Alors, est-il un moyen plus propre disponible pour réaliser ce que je fais avec .then chaîne i.e. ont une chaîne plus propre.

De même, est-il possible dans l'exécution de promesses séquentielles que la fonction de promesse suivante obtienne la valeur de retour de la promesse précédente qui a été exécutée. PS: Promise longueur de tableau sait au préalable.

+0

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

+0

Pourquoi ne pas aplatir la chaîne? Les promesses imbriquées ne devraient pas être nécessaires. 'cart.getBasket (req) .then (cart.updateBasket.bind (non défini, req) .then (cart.updateDefaultShipment.bind (undefined, req))'. Vous ne devez pas utiliser bind non plus, vous pouvez utiliser une fonction de publicité. – ste2425

Répondre

2

Vous pouvez séquencer promesses sans cesse croissante de nidification comme celui-ci:

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); 
    }); 
}); 

De retour d'une promesse d'une .then() chaînes autoamtically il à la promesse mère qui vous permet d'utiliser un gestionnaire .then() sur la promesse mère plutôt que en utilisant une imbrication plus profonde pour continuer la séquence.

Ceci a automatiquement transmis les résultats de la promesse précédente à la chaîne suivante, mais elle ne transmet pas tous les résultats antérieurs aux promesses suivantes. Si vous avez besoin d'autres résultats antérieurs, vous pouvez voir plusieurs façons de le faire ici: How to chain and share prior results with Promises