AngularJS中使用$q的执行顺序--Promise链接

5

以下方法可行:

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

1个回答

7
您正在询问如何在Promise中连接函数。

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

4) 如何使下一个函数依赖于前一个结果?

为了在中链接下一个函数,需要返回数据(或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)如果例如checkTokenOnline不OK,我不想执行其余的函数,我该如何在此时退出(退出,中断等)?

拒绝一个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) 我如何将它们中的一些设置为并行运行,另一些设置为串行运行?

要使两个函数并行运行,请创建两个 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方法。
函数式编程的经验法则是始终返回某些内容

有用的链接


1
.then() 总是可用的吗?正确的语法是什么?return 在代码中独立存在,而不在花括号内?这对 PHP 程序员来说有些令人困惑。 - user3025289
@georgeawg,你能回答孤独的程序员的问题吗?这是一个很好的问题,我认为...非常感谢。 - user2227400
1
@LonelyProgrammer .then 是 JavaScript Promise 的标准方法。请参阅 Promises/A+ 开放标准。或者特别针对 AngularJS,请参阅 AngularJS $q 服务 API 参考 - georgeawg
1
@LonelyProgrammer AngularJS服务返回承诺包括$q.when$http$timeout$interval,所有.then.catch方法,许多AngularJS自定义模块和工厂服务以及其他服务。 - georgeawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接