Javascript HTTP Post按顺序调用Angularjs
我试图通过更改请求主体来进行顺序post请求。原因是我有一个RESTAPI,我正在调用它来创建用户,但是返回它需要一些时间。我想基本上成批发送请求,基本上调用相同的端点,只是调用不同的请求体。我见过其他关于按顺序调用函数的问题,但它们似乎总是一组做不同事情的函数。我就是不能把我的大脑放在明显的递归上 到目前为止,我有一个返回承诺的函数,但我不知道如何编写递归来调用这个函数来遍历所有$scope.csvResultsJavascript HTTP Post按顺序调用Angularjs,javascript,angularjs,Javascript,Angularjs,我试图通过更改请求主体来进行顺序post请求。原因是我有一个RESTAPI,我正在调用它来创建用户,但是返回它需要一些时间。我想基本上成批发送请求,基本上调用相同的端点,只是调用不同的请求体。我见过其他关于按顺序调用函数的问题,但它们似乎总是一组做不同事情的函数。我就是不能把我的大脑放在明显的递归上 到目前为止,我有一个返回承诺的函数,但我不知道如何编写递归来调用这个函数来遍历所有$scope.csvResults $scope.importUsersPromise = function(cur
$scope.importUsersPromise = function(currentIndex, step) {
var nextInput = $scope.csvResults.slice(currentIndex, currentIndex+step);
var requestBodyUsers = {
"mode": "SCRIPT",
"inputParams": [
JSON.stringify(nextInput)
]
};
return $http({
method: 'POST',
url: api_url + "v1/serverAction/",
headers: {
"Authorization":"user",
"Content-Type":"application/json"
},
requestBodyUsers
});
};
假设您有一个包含所有不同请求主体的数组
users
。然后你可以这样做:
var users = [/* your request bodies */];
var errors = [/* will store the errors */];
// make the first api call
var promise = apiCall(users[0]);
// use .reduce to chain all requests
promise = users.slice(1).reduce(function(promise, user){
return promise.then(apiCall.bind(null, user));
}, promise);
promise
.then(function(){
// do something when all users are inserted
})
.finally(function(){
// do something when all requests are done
// even if some of them have failed
console.log(errors);
})
function apiCall(user) {
return $http({... })
}
您必须记住,如果其中一个请求失败,则链将断开,并且不会发送以下请求。如果仍要发送错误,应使用.finally
和可选的.catch
来收集错误:
// use .reduce to chain all requests
promise = users.slice(1).reduce(function(promise, user){
return promise
.catch(err => errors.push(err)) // fail handler (optional)
.finally(apiCall.bind(null, user)); // always make the next api call
}, promise);
如果还没有,最好检查一下;) 您可以将所有请求集放入请求数组中
请查看链接。使用$q将函数设为承诺,当所有请求完成时,您可以在数组中推送承诺并使用$q.all()解析。@MuhammedNeswine,
$q.all
不保证所有参数承诺的顺序执行,这是OP需要的。你只是想逐项检查csvResults数组中的每一项,并通过http请求发送该信息吗?@JoshuaFoxworth,基本上是的。但是,由于每个http请求都通过这个供应商api使用相同的脚本,因此我认为需要按顺序分批执行,以确保安全。然后向最终用户展示一个加载条。我将不得不进一步研究。reduce,但这看起来不错。我已经实现了您的解决方案,效果非常好@user3629092,当我尝试使用错误处理程序时,如果遇到请求超时之类的错误,它仍然会停止。从代码看,它似乎应该命中err子句,并将错误推送到数组中。我不认为会发生这种事,我的错。我已经习惯了原生承诺的实现,似乎存在一些差异。我已经修改了这个示例,使它能够像预期的那样与angular的$q
承诺实现一起工作。