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