HTTP Post按顺序调用Angularjs

时间:2017-05-17 02:54:10

标签: javascript angularjs

我正在尝试使用angular更改请求正文进行连续发布请求。原因是我有一个REST API,我打电话来创建用户,但它需要一些时间来返回。我基本上想要批量发送请求,本质上只是调用相同的端点,只是不同的请求体。我已经看到了关于顺序调用函数的其他问题,但它们似乎总是一组执行不同功能的函数。我不能在这里明显递归我的大脑。

到目前为止,我有这个函数返回了promise但我不知道如何编写递归来调用这个函数来遍历所有$ scope.csvResults。

$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
    });
};

2 个答案:

答案 0 :(得分:0)

假设您有一个包含所有不同请求主体的数组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);

如果不是,我们最好检查一下angular's documentation;)

答案 1 :(得分:0)

您可以将所有请求集放在 requestArray

请查看this链接。