在angularJS中处理多个异步发布请求

Posted

技术标签:

【中文标题】在angularJS中处理多个异步发布请求【英文标题】:Handle multiple asynchronous post request in angularJS 【发布时间】:2018-06-12 21:19:25 【问题描述】:

这是一种情况 .. 我们有一个 UI,您可以在其中选择要在 vm 上安装的产品,因此最初我们使用 javascript 对象数组发送有效负载,其中每个对象都包含有关产品的信息。一旦完成所有产品的安装,我们就会收到响应。但现在我们正在改变流程。首先,您选择要在 VM 上安装的所有产品,一旦开始安装,就会安装一个一个产品,您可以在 UI 上查看实时状态,例如哪个产品正在进行中,谁的安装已完成以及所有内容其余的。

在技术语言中 .. 使用 Angular 服务,我们曾经发送对象数组,在所有产品安装成功时我们会得到响应,但如果任何一个失败,则很难跟踪所有安装完成的内容以及哪些剩余。因此,为了简化此过程,我们决定将产品一一发送以进行安装,并将相应的成功/失败状态显示在屏幕上。我面临的挑战是如何对数组中存在的每个对象一个接一个地进行异步调用。

【问题讨论】:

到目前为止你做了什么? 我在服务中尝试了一个 for 循环,但似乎只安装了一个产品不起作用..实际上无法正确处理承诺。 向我们展示您的代码,只有我们可以提供帮助 【参考方案1】:

尝试使用带有类似标志的递归:

假设 myArray 是数据数组。

var myflag = 0;

function myFunction()

 if(myFlag <= myArray.length -1)

   var dataToSend = myArray[myFlag];

     $http.post('URL', dataToSend).then(
       function success(response)
        myFlag++;
        myFunction();
       
     );

   


【讨论】:

【参考方案2】:

您可以尝试遍历一系列产品信息,并在每次成功时调用 install product 函数:

var arrayOfProducts = [
  ..,
  ..
];

function installProduct(product) 
  if(!product) 
    return;
  

  var request = 
    method: 'POST',
    url: '..',
    data: product
  ;

  return $http(request)
    .then(function() 
      var nextProduct = arrayOfProducts.shift();
      return installProduct(nextProduct);
    );


var firstProduct = arrayOfProducts.shift();
installProduct(firstProduct);

这段代码未经测试,但无论如何它应该只是一个想法。

【讨论】:

以上是关于在angularJS中处理多个异步发布请求的主要内容,如果未能解决你的问题,请参考以下文章

angular中处理多个异步请求的方法汇总

如何在angularjs执行多个异步操作后再执行指定操作

AngularJS中的$http缓存以及处理多个$http请求

[Angularjs]$http.post与$.post

关于angularjs异步操作后台请求时,用$q.all排列先后顺序的问题

swift中具有多个闭包/ API请求的函数中的异步完成处理