Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTTP Post按顺序调用Angularjs_Javascript_Angularjs - Fatal编程技术网

Javascript HTTP Post按顺序调用Angularjs

Javascript HTTP Post按顺序调用Angularjs,javascript,angularjs,Javascript,Angularjs,我试图通过更改请求主体来进行顺序post请求。原因是我有一个RESTAPI,我正在调用它来创建用户,但是返回它需要一些时间。我想基本上成批发送请求,基本上调用相同的端点,只是调用不同的请求体。我见过其他关于按顺序调用函数的问题,但它们似乎总是一组做不同事情的函数。我就是不能把我的大脑放在明显的递归上 到目前为止,我有一个返回承诺的函数,但我不知道如何编写递归来调用这个函数来遍历所有$scope.csvResults $scope.importUsersPromise = function(cur

我试图通过更改请求主体来进行顺序post请求。原因是我有一个RESTAPI,我正在调用它来创建用户,但是返回它需要一些时间。我想基本上成批发送请求,基本上调用相同的端点,只是调用不同的请求体。我见过其他关于按顺序调用函数的问题,但它们似乎总是一组做不同事情的函数。我就是不能把我的大脑放在明显的递归上

到目前为止,我有一个返回承诺的函数,但我不知道如何编写递归来调用这个函数来遍历所有$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
    });
};

假设您有一个包含所有不同请求主体的数组
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
承诺实现一起工作。