带有 `$q` 的 AngularJS 执行顺序——链接 promise

标签 angularjs angular-promise

以下方法有效:

$q.when()
        .then(checkCookieToken)         // check if cookie already exists e.g. in cookie
        .then(setHeader)                // set Header with REST-Token e.g from cookie
        .then(checkTokenOnline)         // if not OK logout
        .then(getMenu)                  // if previous OK get navigation menu
        .then(getDataResource)          // set ngResource
        .then(getData);                 // and query it

4个问题:

1) 如果例如checkTokenOnline不行,我不想执行其余功能,此时我如何退出(退出,中断,等等)?

2) 我怎样才能将其中一些设置为并行,而其中一些设置为串行?

3) 如何在它们之间传输数据?

4) 我怎样才能使下面的函数依赖于它以前的结果?

最佳答案

你是问怎么做链条 promise 中的功能。

3) How can I transfer data between them?

4) How can I make the following function depend on its previous result?



返回 中下一个函数的数据(或 promise )链条 :
var p2 = p1.then ( function (data) {
     var nextData = someFn(data);
     return nextData;
});

var p3 = p2.then ( function (nextData) {
     var nextData2 = someOtherFn(nextData);
     return nextData2;
});

//return for further chaining
return p3;

1) If e.g. checkTokenOnline is not OK, I don't want to execute the rest functions, how can I quit (exit, break, whatever,..) at this point?



拒绝 一个 promise ,有你的功能一个错误。该链将跳过所有 .then方法,直到您提供错误处理程序。
var p2 = p1.then ( function checkTokenOnline (response) {
             if ( isBadFn(response) {
                 throw error;
             } else {
                 return nextData;
             }
   }) .then ( someFn 
    ) .then ( someOtherFn
    ) .catch ( function (error) {
          // someFn and someOtherFn skipped
          //log error
          throw error;
   });

 //return for further chaining
 return p2;

2) How can I set some of them parallel and some of them serial ?



要使两个函数并行运行,请做出两个 promise 。使用 $q.all等待他们两个完成。
var p1 = $q.when ( fn1() );
var p2 = $q.when ( fn2() );

var p3 = $q.all ( [p1, p2] );

var p4 = p3.then ( function (responseList) {
      var response1 = responseList[0];
      var response2 = responseList[1];
      return something;
}). catch ( function (error) {
      //log error
      throw error;
});

//return for further chaining
return p4;

请注意 $q.all不是 有弹性 .如果任何 promise 抛出错误,.then方法将被跳过,只有第一个错误会转到 .catch方法。

函数式编程的经验法则是 总是返回一些东西 .

有用的链接
  • AngularJS $q Reference - Chaining promises
  • You're Missing the Point of Promises .
  • Ninja Squad -- Traps, anti-patterns and tips about AngularJS promises
  • 关于带有 `$q` 的 AngularJS 执行顺序——链接 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34324153/

    相关文章:

    javascript - Angularjs - 范围的变化没有反射(reflect)出来

    javascript - AngularJS 验证和 promise

    angularjs - Angular 在提升 promise.catch 之前将错误记录到控制台

    javascript - 终于阻止了 Angular 2的 promise

    javascript - AngularJS - 将 then() 与 $http 服务一起使用

    javascript - 用 Fetch API 替换 $http

    javascript - 将变量作为 ngModel 传递给属性指令

    AngularJS 多指令资源争用

    javascript - 如何解决编写嵌套指令时缺乏 promise 展开的问题

    javascript - AngularJS 选项卡中的 Highcharts 动态(重新)调整大小