使用`$ q`的angular度执行顺序

以下方法工作:

$q.when() .then(checkCookieToken) // check if cookie already exists eg in cookie .then(setHeader) // set Header with REST-Token eg 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不正确,我不想执行其余的函数,在这一点上我怎样才能退出(exit,break,whatever,..)?

2)我怎么能设置其中的一些并行和其中一些串行?

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

4)我怎样才能使以前的结果依赖于以下function?

你在问如何在promise中链接函数。

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

4)如何根据以前的结果做出如下function?

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

 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方法,直到你提供一个error handling程序。

 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没有弹性 。 如果任何承诺引发错误,则.then方法将被跳过,只有第一个错误将转到.catch方法。

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


有用的链接

忍者队 – 陷阱,反模式和有关AngularJS承诺的提示