如何创建我自己的承诺?
问题描述:
我有两个有关AngularJS承诺的问题:如何创建我自己的承诺?
- 我该如何创建自己的承诺?
请参见下面的代码:
function controller($http) {
var dataCache;
function getData(){
if(dataCache != null){
// should return my own promise here
// to pass the value of 'dataCache' to 'then' immediately
} else {
return $http.get('...some url ...');
}
}
}
- 如何返回最后一个承诺?
代码:
function controller($http) {
var urlArr = ['url1', 'url2', 'url3'];
function getDataOneByOne() {
// should call $http.get() for the url in the 'urlArr' one after another in a chain
// and return the last promise
}
}
答
对于第二个问题,做urlArr
Array.prototype.reduce
,并建立承诺链:
function controller($http, $q) {
var urlArr = ['url1', 'url2', 'url3'];
function getDataOneByOne() {
return urlArr.reduce(function (chain, url) {
return chain.then(function() {
return $http.get(url);
});
}, $q.when());
}
}
不要忘了处理$ HTTP错误,虽然。
+0
不错,你打败了我,做了一个更好的工作。完整的promise库对于这类事情有更好的解决方案,但这对于有限的Angular'$ q' api很有用。 – m59 2014-09-06 01:52:53
答
对于第一个问题,我相信你正在寻找$q.when()
。它在承诺中包含一个正常值并解决它。
function getData(){
if(dataCache !== null) {
$q.when(dataCache);
} else {
return $http.get('...some url ...');
}
}
getData.then(function() {
});
请参阅Klaster的第二个问题的答案。
https://docs.angularjs.org/api/ng/service/$q – Ian 2014-09-06 01:37:16
请在将来写每个帖子一个问题。尝试以对社区最有帮助的方式撰写你的帖子(未来的观众)。 – m59 2014-09-06 01:56:13