Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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请求的串行执行_Javascript_Angularjs - Fatal编程技术网

Javascript http请求的串行执行

Javascript http请求的串行执行,javascript,angularjs,Javascript,Angularjs,我在下面的代码中尝试串行执行httpt请求 下面是代码 var httpPostData = function (postparameters,postData){ return $http ({ method : 'POST', url : URL, params : postparameters, headers: headers, data : postData }).success (functi

我在下面的代码中尝试串行执行httpt请求 下面是代码

var httpPostData = function (postparameters,postData){

  return $http ({           
    method  : 'POST',
    url     : URL,
    params  : postparameters,
    headers: headers,
    data    : postData
   }).success (function (responseData){
         return responseData.data;
   })
}

for (var app of appArray){        

    var addAppPromise = httpPostData (restartAppParams,app);         
     addAppPromise.then(function(status){             
         console.log(status.data);             
     })
}
appArray是一个服务器列表,我在其中逐个连接,并根据上面http post传递的参数(restartAppParams)执行一些操作

我希望此执行连续进行,即只有在前一个http请求完成并收到响应时,才应执行下一个http请求。 你知道怎么做吗?

试试这个:

var httpPostData = function(postparameters, postData, next) {

  return $http ({           
    method  : 'POST',
    url     : URL,
    params  : postparameters,
    headers : headers,
    data    : postData
   }).success (function (responseData) {
         if (typeof next == 'function') {
             next();
         }
   });
}

var appArrayCopy = appArray.slice();
function fetch() {
    if (appArrayCopy.length) {
        var app = appArrayCopy.shift();
        httpPostData(restartAppParams, app, fetch);
    } else {
        // finished
    }
}
试试这个:

var httpPostData = function(postparameters, postData, next) {

  return $http ({           
    method  : 'POST',
    url     : URL,
    params  : postparameters,
    headers : headers,
    data    : postData
   }).success (function (responseData) {
         if (typeof next == 'function') {
             next();
         }
   });
}

var appArrayCopy = appArray.slice();
function fetch() {
    if (appArrayCopy.length) {
        var app = appArrayCopy.shift();
        httpPostData(restartAppParams, app, fetch);
    } else {
        // finished
    }
}

默认情况下,angularjs使用异步ajax调用。它实际上是硬编码的,不能更改(请参阅中的第77行,这是当时主分支的负责人,我正在写这篇文章)

另外,请记住,同步调用会阻止所有其他调用,这基本上与javascript构建的非阻塞方法背道而驰

如果你的应用程序依赖于一个接一个的请求,你可以使用承诺和递归调用链接它们。
像这样的方法应该会奏效:

function runXhr(app) {
  var addAppPromise = httpPostData (restartAppParams,app);   
  addAppPromise.then(function(status){             
    console.log(status.data);

    // calls the next service if appArray has any services left
    var app = appArray.shift();
    if (app) {
      runXhr(appArray.shift());
    }
    else {
      return;
    }
  });
}

默认情况下,angularjs使用异步ajax调用。它实际上是硬编码的,不能更改(请参阅中的第77行,这是当时主分支的负责人,我正在写这篇文章)

另外,请记住,同步调用会阻止所有其他调用,这基本上与javascript构建的非阻塞方法背道而驰

如果你的应用程序依赖于一个接一个的请求,你可以使用承诺和递归调用链接它们。
像这样的方法应该会奏效:

function runXhr(app) {
  var addAppPromise = httpPostData (restartAppParams,app);   
  addAppPromise.then(function(status){             
    console.log(status.data);

    // calls the next service if appArray has any services left
    var app = appArray.shift();
    if (app) {
      runXhr(appArray.shift());
    }
    else {
      return;
    }
  });
}

您可以使用
Array.prototype.reduce
来实现这一点:

.controller('Samplecontroller', function($http, $q) {

   var restartAppParams = {}; 

   var httpPostData = function(postparameters, postData){

    return $http ({           
      method  : 'POST',
      url     : URL,
      params  : postparameters,
      headers: headers,
      data    : postData
     });

   };

   appArray.reduce(function(promise, app) {
      return promise.finally(function() {
        return httpPostData(restartAppParams, app)
          .then(function(response) {
            console.log(response.data);
          });
      })
   }, $q.when());

});

您可以使用
Array.prototype.reduce
来实现这一点:

.controller('Samplecontroller', function($http, $q) {

   var restartAppParams = {}; 

   var httpPostData = function(postparameters, postData){

    return $http ({           
      method  : 'POST',
      url     : URL,
      params  : postparameters,
      headers: headers,
      data    : postData
     });

   };

   appArray.reduce(function(promise, app) {
      return promise.finally(function() {
        return httpPostData(restartAppParams, app)
          .then(function(response) {
            console.log(response.data);
          });
      })
   }, $q.when());

});

如果任何请求失败,并且没有提供错误处理的方法,那么这将无法正常运行。您在
return
之后有一个
typeof
检查,您没有对数据做任何处理。@Nomad
shift
从数组前面删除一个元素。@jcubic yeh我知道shift,但我有一个3的数组,在第一次执行之后什么都没有发生,每次执行大约需要15秒才能完成finish@Nomad您是否从成功回调中删除了return?如果任何请求失败,这将无法正确执行,并且无法为您提供错误处理方法。您在
return
之后有一个
typeof
检查,您没有对数据做任何处理。@Nomad
shift
从数组前面删除一个元素。@jcubic yeh我知道shift,但我有一个3的数组,在第一次执行之后什么都没有发生,每次执行大约需要15秒才能完成finish@Nomad您是否从成功回调中删除了返回?此方法的附加好处是
appArray.reduce
返回您可以连锁的承诺。您应该将结果推送到一个数组并返回该数组,而不是
console.log
ing,这可能取决于用户需要什么。我通常在访问不同的端点时这样做,因此,每个响应都有不同的后处理。因此,我猜响应数据的累积可能并不理想。这种方法还有另一个好处,那就是
appArray.reduce
返回一个可以连锁的承诺。您应该将结果推送到一个数组并返回该数组,而不是
console.log
ing,这可能取决于用户需要什么。我通常在访问不同的端点时这样做,因此,每个响应都有不同的后处理。所以,我猜反应数据的积累可能并不理想。