使用重定向到promises链

时间:2014-04-24 14:30:53

标签: javascript angularjs promise

我正在使用promises来调用一系列web服务,但在某些情况下,我希望在逻辑中使用重定向。问题是承诺链在重定向发生后继续执行。

以下是代码:

myfunc = function() {
  return PromiseCall1()

  .then(function(data){
    if (condition){
      $location.path(some_url); // This is a redirection with AngularJS

    } else {
      return PromiseCall2();
    }
  })

  .then(function(data){
    return PromiseCall3();
  })

  .then(function(data){
    // Some other stuff here
  })

};

预期的行为是:

  • PromiseCall1()必须被称为
  • 如果condition为真,则不必调用其他承诺,只需执行重定向
  • 如果condition为false,则必须调用Promise2,然后调用Promise3。

你会怎么做? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

func = function () {
    return PromiseCall1().then(function (data) {
        if (condition) {
            $location.path(some_url); // This is a redirection with AngularJS
        } else {
            return PromiseCall2().then(function (data) {
                return PromiseCall3();
            }).then(function (data) {
                // Some other stuff here
            });
        }
    });
};

答案 1 :(得分:0)

Petka的解决方案还可以。如果你想。如果你使用Maybe。

包装你的处理程序是可能的

类似的东西:

var maybe = function(fn){
     return function(value){
          if(value === maybe.Nothing) return maybe.Nothing;
          return fn.apply(this,arguments);
     };
});
maybe.Nothing = {}; // unique reference

哪会让你做到

Promise.try(function(){
    return 15;
}).then(maybe(function(val){
    console.log("got",val);    
    return maybe.Nothing;
})).then(maybe(function(val){
    console.log("This never gets called");  
}));

这为你提供了一个显式的值钩子,表示不会继续使用may包裹的链中的任何承诺。