Angular Promise - $q.all 不返回结果并且多次调用 Post 方法无效
Angular Promise - $q.all not returning result and calling Post method several times not working
我正在尝试调用 Post
方法,然后根据结果我将多次调用相同的 Post
方法并 return 结果,使用 $q.all.
我的 Post
方法是:
getData: function (params, callback) {
$http.post('service/myService', params)
.success(function (data) {
callback(null, data);
}).error(function (error) {
callback(error);
});
}
我在下面的函数中调用它,这个函数是递归的所以如果它包含 nextUrl
我做同样的事情直到 paging
:
没有对象
var result = [];
var promises = [];
var checkForPaging = function (nextUrl, service, $q) {
var deferred = $q.defer();
var criteria = {
url: url
}
var promise = service.getData(criteria, function (error, data) {
if (data.statusCode == 200) {
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null) {
checkForPaging(data.body.paging.next.url, service, $q);
} else{
deferred.resolve(result);
}
}
});
promises.push(promise);
$q.all(promises)
return deferred.promise;
}
然后我从下面调用此函数,并希望在所有调用完成后取回 result
:
checkForPaging(data.body.paging.next.url, myService, $q).then(function (data) {
console.log(data)
});
我遇到的问题是它永远不会触发上面的回调函数:console.log(data)
。但是我可以看到它多次调用 Post
方法。
如果我像下面这样解决它,那么我可以看到在第一个 Post
之后它正在触发上面的回调:
$q.all(promises).then(function (results) {
deferred.resolve(result);
}, function (errors) {
deferred.reject(errors);
});
我做的对吗?如何取回结果并多次调用 Post 方法?
如果不清楚或有任何问题,请告诉我!
这是解决方案:https://plnkr.co/edit/HqkFNo?p=preview我稍微重写了逻辑。
你可以抓住主要思想。
更新添加了无希望的解决方案
1) 您的服务应该return只承诺:
this.getData = function(url, params){
return $http.post(url, params); //You're just returning promise
}
2) 你不需要$q.all,你可以使用单一承诺:
var result = [];
var deferred;
var checkForPaging = function (url) {
if(!deferred){
deferred = $q.defer();
}
//resolvind service promise
newService.getData(url).then(
//if ok - 200
function(response){
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null){
{
return checkForPaging(data.body.paging.next.url);
} else{
deferred.resolve(result);
}
},
//handle errors here
function(error) {
}
);
return deferred.promise;
}
3) 你应该这样称呼它:
checkForPaging('url').then(function(data){
//here will be resolved promise
console.log(data);
});
使用适当的承诺链尝试这样的事情:
var result = [];
var checkForPaging = function(nextUrl, service) {
var criteria = {
url: url
}
return service.getData(criteria, function(error, data) {
if (data.statusCode == 200) {
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null) {
return checkForPaging(data.body.paging.next.url, service);
} else {
return result;
}
}
});
}
checkForPaging(data.body.paging.next.url, myService).then(function(data) {
console.log(data)
});
并获取数据:
getData: function(params) {
return $http.post('service/myService', params)
.then(function(response) {
return response.data;
});
}
我正在尝试调用 Post
方法,然后根据结果我将多次调用相同的 Post
方法并 return 结果,使用 $q.all.
我的 Post
方法是:
getData: function (params, callback) {
$http.post('service/myService', params)
.success(function (data) {
callback(null, data);
}).error(function (error) {
callback(error);
});
}
我在下面的函数中调用它,这个函数是递归的所以如果它包含 nextUrl
我做同样的事情直到 paging
:
var result = [];
var promises = [];
var checkForPaging = function (nextUrl, service, $q) {
var deferred = $q.defer();
var criteria = {
url: url
}
var promise = service.getData(criteria, function (error, data) {
if (data.statusCode == 200) {
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null) {
checkForPaging(data.body.paging.next.url, service, $q);
} else{
deferred.resolve(result);
}
}
});
promises.push(promise);
$q.all(promises)
return deferred.promise;
}
然后我从下面调用此函数,并希望在所有调用完成后取回 result
:
checkForPaging(data.body.paging.next.url, myService, $q).then(function (data) {
console.log(data)
});
我遇到的问题是它永远不会触发上面的回调函数:console.log(data)
。但是我可以看到它多次调用 Post
方法。
如果我像下面这样解决它,那么我可以看到在第一个 Post
之后它正在触发上面的回调:
$q.all(promises).then(function (results) {
deferred.resolve(result);
}, function (errors) {
deferred.reject(errors);
});
我做的对吗?如何取回结果并多次调用 Post 方法?
如果不清楚或有任何问题,请告诉我!
这是解决方案:https://plnkr.co/edit/HqkFNo?p=preview我稍微重写了逻辑。 你可以抓住主要思想。
更新添加了无希望的解决方案
1) 您的服务应该return只承诺:
this.getData = function(url, params){
return $http.post(url, params); //You're just returning promise
}
2) 你不需要$q.all,你可以使用单一承诺:
var result = [];
var deferred;
var checkForPaging = function (url) {
if(!deferred){
deferred = $q.defer();
}
//resolvind service promise
newService.getData(url).then(
//if ok - 200
function(response){
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null){
{
return checkForPaging(data.body.paging.next.url);
} else{
deferred.resolve(result);
}
},
//handle errors here
function(error) {
}
);
return deferred.promise;
}
3) 你应该这样称呼它:
checkForPaging('url').then(function(data){
//here will be resolved promise
console.log(data);
});
使用适当的承诺链尝试这样的事情:
var result = [];
var checkForPaging = function(nextUrl, service) {
var criteria = {
url: url
}
return service.getData(criteria, function(error, data) {
if (data.statusCode == 200) {
for (var i = 0; i < data.body.items.length; i++) {
result.push(data.body.items[i]);
}
if (data.body.paging != null && data.body.paging.next != null) {
return checkForPaging(data.body.paging.next.url, service);
} else {
return result;
}
}
});
}
checkForPaging(data.body.paging.next.url, myService).then(function(data) {
console.log(data)
});
并获取数据:
getData: function(params) {
return $http.post('service/myService', params)
.then(function(response) {
return response.data;
});
}