使用JavaScript确保发布请求的顺序

时间:2017-10-16 11:27:06

标签: javascript http post request

我在同时调用多个帖子请求时遇到问题。我需要它们按顺序排列,但它们以随机顺序进入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));
    }
}

2 个答案:

答案 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({
      ..})

   })
})

  });
};