http请求的串行执行

时间:2015-11-30 11:06:37

标签: javascript angularjs

我有以下代码,我试图连续执行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请求。 不知道该怎么做..

3 个答案:

答案 0 :(得分:2)

您可以使用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());

});

答案 1 :(得分:1)

试试这个:

import maya.cmds as cmds

cmds.sphere(nsp=10, r=50)

cmds.sphere(nsp=4, r=5)
cmds.setAttr("nurbsSphere2.translateX",-12.583733)
cmds.setAttr("nurbsSphere2.translateY",-2.2691557)
cmds.setAttr("nurbsSphere2.translateZ",48.33736)

cmds.nurbsBoolean("nurbsSphere1", "nurbsSphere2", nsf=1, op=1)

cmds.sphere(nsp=4, r=5)
cmds.setAttr("nurbsSphere3.translateX",-6.7379503)
cmds.setAttr("nurbsSphere3.translateY",3.6949043)
cmds.setAttr("nurbsSphere3.translateZ",49.40595)

cmds.nurbsBoolean("nurbsBooleanSurface1", "nurbsSphere3", nsf=1, op=1)

print(cmds.ls("nurbsBooleanSurface1_*", type="transform"))

答案 2 :(得分:0)

angularjs默认使用异步ajax调用。它实际上是硬编码的,无法更改(参见this commit中的第77行,当时是主分支的HEAD,我正在写这个)。

另外,请记住,同步调用会阻止其他所有基本上违反javascript为其构建的非阻塞方法的内容。

如果你的应用程序依赖于一个接一个的请求,你可以使用promise和递归调用链接它们。
这样的事情应该有效:

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