【问题标题】:AngularJS execution order with `$q` -- Chaining PromisesAngularJS 执行顺序与 `$q` —— 链式 Promises
【发布时间】:2019-04-26 21:34:17
【问题描述】:

以下方法有效:

$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) 如何使以下函数依赖于其先前的结果?

【问题讨论】:

    标签: angularjs angular-promise


    【解决方案1】:

    您在问如何在 Promise 中链接函数。

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

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

    中的下一个函数返回数据(或承诺):

    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) 如果例如checkTokenOnline 不行,我不想执行其余的函数,此时我该如何退出(exit,break,whatever,..)?

    拒绝一个承诺,让你的函数抛出一个错误。该链将跳过所有 .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) 我怎样才能设置其中一些并行和一些串行?

    要使两个函数并行运行,请做出两个承诺。使用$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 方法。

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


    有用的链接

    【讨论】:

    • .then() 是否一直可用?正确的语法如何? return 单独存在于代码中并且不在大括号内?对 PHP 程序员来说有点恼火。
    • @georgeawg 你会回答 Lonely Programmer 的问题吗?这是个好问题,我认为.. 非常感谢..
    • @LonelyProgrammer .then 是 JavaScript 承诺的标准方法。请参阅Promises/A+ Open Standard。或者专门针对 AngularJS 的 AngularJS $q Service API Reference
    • @LonelyProgrammer 返回承诺的 AngularJS 服务包括 $q.when$http$timeout$interval、所有 .then.catch 方法、许多 AngularJS 自定义模块和工厂服务以及其他人。
    猜你喜欢
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多