如何连锁承诺

时间:2016-02-24 19:27:18

标签: javascript angularjs promise

我有一个关于链接承诺的问题。

这是我的代码:

var removeProducts = function(id) {
    anotherService.removeProducts(id); // this will return a promise.
}

var addProduct = function(id) {
    myService.addProduct({id: id})
}

$scope.pickProduct = function() {
    myService.updateId({'id':123}).$promise.then(function(items) {
        items.categories.filter(function(category) {
            if (category.type === 'NEW') {
               removeProducts(items.id);
            }
        })
        //this is the part I don't know how to proceed. I need to make sure 
        //the product is removed before first and update ID second so I can add     
        //another product.  

        addProduct(item.id);
    })
}

基本上,每次添加或删除产品时,我都需要从updateId调用myService方法。所以步骤如下:

Update ID
Remove product if there is a type 'New'
Update ID 
Add product

我该如何更改?谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

调用从removeProduct返回的thenID函数。像这样:

$scope.pickProduct = function() {
  myService.updateId({
    'id': 123
  }).$promise.then(function(items) {
    items.categories.filter(function(category) {
      if (category.type === 'NEW') {
        removeProducts(items.id).then(function() {
            //call updateId .then(function(){
            // call add product
          }
        };
      }
    })
  })
}

答案 1 :(得分:1)

基本上你可以像这样链接承诺:

myService.pickProduct(product)
    .then(_update)
    .then(_remove)
    .then(_add)
    .catch(..);



function _update(product) {
    return product.id;
}

function _remove(id) {
   return new Date();
}

function _add(date) {

}

then的返回值将是下一个“链”承诺then的输入。在我的情况下,服务函数pickProduct必须返回保存产品的承诺,因为我希望它在_update中作为输入,依此类推。