AngularJS 带有 `$q` 的执行顺序 -- Chaining Promises
AngularJS execution order with `$q` -- Chaining Promises
以下方法有效:
$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
不行,我不想执行其余的功能,我怎么能在这个时候退出(exit,break,whatever,..)?
2) 如何设置一些并联一些串行?
3) 如何在它们之间传输数据?
4) 如何使以下函数依赖于其先前的结果?
你问的是如何在 promises 中链函数。
3) How can I transfer data between them?
4) How can I make the following function depend on its previous result?
Return 链中下一个函数的数据(或承诺):
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?
为了拒绝一个承诺,让你的函数抛出一个错误。该链将跳过所有 .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 ?
要并行执行两个函数 运行,请做出两个承诺。使用 $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
方法。
函数式编程的经验法则是总是return一些。
有用的链接
以下方法有效:
$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
不行,我不想执行其余的功能,我怎么能在这个时候退出(exit,break,whatever,..)?
2) 如何设置一些并联一些串行?
3) 如何在它们之间传输数据?
4) 如何使以下函数依赖于其先前的结果?
你问的是如何在 promises 中链函数。
3) How can I transfer data between them?
4) How can I make the following function depend on its previous result?
Return 链中下一个函数的数据(或承诺):
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?
为了拒绝一个承诺,让你的函数抛出一个错误。该链将跳过所有 .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 ?
要并行执行两个函数 运行,请做出两个承诺。使用 $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
方法。
函数式编程的经验法则是总是return一些。