Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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,在我的AngularJS应用程序中,我可以按顺序执行不同数量的http请求。我认为为此我需要一个循环: for (let i = 0; i < $scope.entities.length; i++) { MyService.createFixedValue($scope.id, $scope.entities[i]); } 但在这种情况下,我的请求是异步的。我需要做哪些更改才能获得连续请求?可能尝试不返回http POST请求。实际上,您可能不需要在函数中返回任何内容。只需执行

在我的AngularJS应用程序中,我可以按顺序执行不同数量的http请求。我认为为此我需要一个循环:

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);
});
有关详细信息,请参阅


要按顺序发出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);
});
有关详细信息,请参阅


async
/
wait
创建的ES6承诺未与AngularJS框架集成。AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定、异常处理、属性监视等。由
async
/
await
创建的ES6承诺未与AngularJS框架集成。AngularJS通过提供自己的事件处理循环来修改正常的JavaScript流。这将JavaScript分为经典和AngularJS执行上下文。只有在AngularJS执行上下文中应用的操作才会受益于AngularJS数据绑定、异常处理、属性监视等。非常感谢!它和@EmielZuurbier解决方案一样有效!现在我只需要决定哪一个更适合我的特殊情况,非常感谢!它和@EmielZuurbier解决方案一样有效!现在我只需要决定哪个更适合我的特殊情况