2015-11-30 40 views
0

我有下面的代码中,我试图执行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请求应被串行执行,即发生。 任何想法如何做到这一点..

回答

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

这种方法还有'appArray.reduce'返回一个你可以链接的承诺。您应该将结果推送到数组并返回,而不是'console.log',可能。 –

+0

这真的取决于用户的需求。我通常在访问不同的终点时这样做,因此,每个响应都有不同的后处理。所以我猜测反应数据的积累是**可能**不理想,**可能**。 – ryeballar

1

试试这个:

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 
    } 
} 
+0

这不正确的行为,如果任何请求的失败,而且不会给你一个方法错误句柄。你在return之后有一个'typeof'检查,你没有对数据做任何事情。 –

+0

此方法不会移动到数组中的下一个元素。 – Nomad

+0

@Nomad'shift'从阵列的前面移除一个元素。 – jcubic

0

angularjs默认使用异步Ajax调用。它实际上是硬编码的,无法更改(请参阅this commit中的第77行,这是当时master分支的头部,我正在写这篇文章)。

另外,请记住,同步调用阻止一切基本上是对JavaScript的是为内置的无阻塞方法。

如果您的应用程序依赖于请求beeing做了一个又一个,你可以使用他们的承诺和递归调用链。
像这样的东西应该工作:

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