Javascript 循环内的连续http请求
在我的AngularJS应用程序中,我可以按顺序执行不同数量的http请求。我认为为此我需要一个循环:Javascript 循环内的连续http请求,javascript,angularjs,Javascript,Angularjs,在我的AngularJS应用程序中,我可以按顺序执行不同数量的http请求。我认为为此我需要一个循环: for (let i = 0; i < $scope.entities.length; i++) { MyService.createFixedValue($scope.id, $scope.entities[i]); } 但在这种情况下,我的请求是异步的。我需要做哪些更改才能获得连续请求?可能尝试不返回http POST请求。实际上,您可能不需要在函数中返回任何内容。只需执行
for (let i = 0; i < $scope.entities.length; i++) {
MyService.createFixedValue($scope.id, $scope.entities[i]);
}
但在这种情况下,我的请求是异步的。我需要做哪些更改才能获得连续请求?可能尝试不返回http POST请求。实际上,您可能不需要在函数中返回任何内容。只需执行post请求。如果需要捕获响应,请将其放入全局数组。可能尝试不返回http POST请求。实际上,您可能不需要在函数中返回任何内容。只需执行post请求。如果需要捕获响应,请将其放入全局数组。顺序请求(不推荐) 用于和创建HTTPRequests的顺序循环 构建一个
async
函数,如下例所示
async function createFixedValues(id, entities) {
for (const entity of entities) {
await MyService.createFixedValue(id, entity);
}
}
并通过注入$scope
属性来调用它
createFixedValues($scope.id, $scope.entities);
单个请求并发送阵列(推荐)
只需在一个HTTPRequest中发送整个数组,而不必为每个实体发送请求,这样会更容易。结果将是相同的,但单个请求将更有效
service.createFixedValue = function(property_id, fixed_value_entities) {
return $http({
method: 'POST',
url: '/my_url'
headers: {
'Content-Type': 'application/json'
},
data: fixed_value_entities
});
}
将整个$scope.entities
数组作为第二个参数
MyService.createFixedValue($scope.id, $scope.entities);
您必须修改请求的服务器端,因为您现在发送的是数组而不是单个值。但您尚未指定如何处理服务器端响应,因此这取决于您。顺序请求(不推荐)
用于和创建HTTPRequests的顺序循环
构建一个async
函数,如下例所示
async function createFixedValues(id, entities) {
for (const entity of entities) {
await MyService.createFixedValue(id, entity);
}
}
并通过注入$scope
属性来调用它
createFixedValues($scope.id, $scope.entities);
单个请求并发送阵列(推荐)
只需在一个HTTPRequest中发送整个数组,而不必为每个实体发送请求,这样会更容易。结果将是相同的,但单个请求将更有效
service.createFixedValue = function(property_id, fixed_value_entities) {
return $http({
method: 'POST',
url: '/my_url'
headers: {
'Content-Type': 'application/json'
},
data: fixed_value_entities
});
}
将整个$scope.entities
数组作为第二个参数
MyService.createFixedValue($scope.id, $scope.entities);
您必须修改请求的服务器端,因为您现在发送的是数组而不是单个值。但您尚未指定如何处理服务器端响应,因此这取决于您。要按顺序发出HTTP请求,请使用
$q.all
和数组。reduce
:
var sequentialPromise = $scope.entities.reduce( (p, ent) => {
var pn = MyService.createFixedValue($scope.id, ent);
var valuePromise = pn.then(response => response.data);
var newP = p.then( vArr => {
return $q.all([...vArr, valuePromise]);
});
return newP;
}, $q.when([]) );
sequentialPromise.then(valueArr => {
console.log(valueArr);
}).catch(error => {
console.log(error);
});
有关详细信息,请参阅
$q.all
和数组。reduce
:
var sequentialPromise = $scope.entities.reduce( (p, ent) => {
var pn = MyService.createFixedValue($scope.id, ent);
var valuePromise = pn.then(response => response.data);
var newP = p.then( vArr => {
return $q.all([...vArr, valuePromise]);
});
return newP;
}, $q.when([]) );
sequentialPromise.then(valueArr => {
console.log(valueArr);
}).catch(error => {
console.log(error);
});
有关详细信息,请参阅
async
/wait
创建的ES6承诺未与AngularJS框架集成。AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定、异常处理、属性监视等。由async
/await
创建的ES6承诺未与AngularJS框架集成。AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定、异常处理、属性监视等。非常感谢!它和@EmielZuurbier解决方案一样有效!现在我只需要决定哪一个更适合我的特殊情况,非常感谢!它和@EmielZuurbier解决方案一样有效!现在我只需要决定哪个更适合我的特殊情况