我在同时调用多个帖子请求时遇到问题。我需要它们按顺序排列,但它们以随机顺序进入API。如何在JavaScript上使用http方法确保序列顺序?
这是我正在做的一个例子:
for( var i = 0; i < result.length; i++ ) {
$scope.update(result[i]);
}
$scope.update = function(results) {
$http({
method: 'POST',
url: Config.serverUrl,
data: JSON.stringify(results),
headers: {'Content-Type': 'application/json'}
}).then(function (response) {
if ( response.data.status === "OK") {
$scope.error = null;
$scope.success = "Banco atualizado!";
} else {
$scope.error = response.data.message;
$scope.success = null;
}
$scope.searchTimeout();
}, function (response) {
$scope.error = "Banco atualizado! (erro baddata)";
$scope.success = null;
});
};
更新
根据@TJCrowder建议,使用两个for
循环并使用promise
的示例:
$scope.myFunc = function(results) {
return new Promise(function(resolve) {
resolve($scope.update(results));
});
};
var p = Promise.resolve();
for( var j = 0; j < result[3].length; j++ ){
for( var i = 0; i < result[4].length; i++ ){
p = p.then($scope.myFunc.bind($scope, results));
}
}
答案 0 :(得分:1)
向return
添加update
,以便您返回承诺,然后将循环转换为reduce
来电:
results.reduce(function(p, entry) {
return p.then(function() { return $scope.update(entry); });
}, Promise.resolve());
通过创建一个保证链,它会串行调用,等待前一个调用在开始下一个调用之前完成。
如果您使用非数组列表或类似内容执行此操作,则只需使用for
循环就可以执行此操作:
var p = Promise.resolve();
for (var i = 0; i < results.length; ++i) {
p = p.then($scope.update.bind($scope, results[i]));
}
我们需要bind
(或类似的东西),否则我们会遇到closures in loops问题。如果您可以依赖ES2015 +功能,则可以使用let
代替,这将使每个闭包关闭自己的i
:
let p = Promise.resolve();
for (let i = 0; i < results.length; ++i) {
// ^^^-- Important, `let` and `var` are quite different here
p = p.then(() => $scope.update(results[i]));
}
在my answer to this other question中有更多关于处理一系列承诺与平行承诺的细节,但我认为这可以说是一个重复的问题。
答案 1 :(得分:0)
您可以成功拨打每个POST
请求callback
像
$scope.update = function(item) {
$http({
method: 'POST',
url: Config.serverUrl,
data: JSON.stringify(item),
headers: {'Content-Type': 'application/json'}
}).then(function (response) {
if ( response.data.status === "OK")
$http({ ..
}).then(function(response){
if ( response.data.status === "OK")
$http({..
}).then(function(response){
if ( response.data.status === "OK")
$http({
..})
})
})
});
};