angularjs按顺序链接http post

angularjs按顺序链接http post,angularjs,angular-promise,Angularjs,Angular Promise,在我的应用程序中,我将数据存储在本地存储器中,并在后台触发异步http post。成功发布后,将从本地存储中删除发布的数据。在处理http post时,可能会有更多数据添加到本地存储,因此我需要将post排队并按顺序处理它,因为我需要等待本地存储从成功的post中清除。应该递归调用该任务,直到本地存储中有数据为止 taskQueue: function () { var deferred = $q.defer(); queue.push(deferred); var pr

在我的应用程序中,我将数据存储在本地存储器中,并在后台触发异步http post。成功发布后,将从本地存储中删除发布的数据。在处理http post时,可能会有更多数据添加到本地存储,因此我需要将post排队并按顺序处理它,因为我需要等待本地存储从成功的post中清除。应该递归调用该任务,直到本地存储中有数据为止

taskQueue: function () {
    var deferred = $q.defer();
    queue.push(deferred);
    var promise = deferred.promise;

    if (!saveInProgress) {
      // get post data from storage
      var promises = queue.map(function(){$http.post(<post url>, <post data>).then(function(result){
          // clear successful data
          deferred.resolve(result);
      }, function(error){
         deferred.reject(error);
      })
    })

    return $q.all(promises);
}
taskQueue:函数(){
var deferred=$q.deferred();
队列推送(延迟);
var承诺=延期承诺;
如果(!saveInProgress){
//从存储器中获取post数据
var promises=queue.map(函数(){$http.post(,).then(函数(结果){
//清除成功的数据
延迟。解决(结果);
},函数(错误){
延迟。拒绝(错误);
})
})
返回$q.all(承诺);
}

作为角型新手,我对上述代码没有顺序性存在问题。如何实现我的目标?队列长度未知,而且随着进程的进行,队列长度也会增加。如果这是重复的,请告诉我其他答案。

实现这一点的简单方法是使用。在那里你可以找到一种方法od称为
mapSeries
。您可以在队列上运行它,它将依次处理数组的所有元素,并且只有在调用正确的回调时才会继续处理下一个元素。

Async.js听起来是个好主意,但如果您不想使用库

$q.all将批量处理一系列请求,并同时启动它们,并在阵列中的所有承诺都解决时解决—这不是您想要的

要从数组顺序调用$http,请执行以下操作

var request0 = $http.get('/my/path0');
var request1 = $http.post('/my/path1', {data:'fred'});
var request2 = $http.get('/my/path2');
var requestArray = [];
然后

requestArray.push(request0);
requestArray.push(request1);
requestArray.push(request2);
requestArray[0].then(function(response0) {
    // do something with response0
    return requestArray[1];
}).then(function(response1) {
    // do something with response1
    return requestArray[2];
}).then(function(response2) {
    // do something with response2
}).catch(function(failedResponse) {
    console.log("i will be displayed when a request fails (if ever)", failedResponse)
});
然后

requestArray.push(request0);
requestArray.push(request1);
requestArray.push(request2);
requestArray[0].then(function(response0) {
    // do something with response0
    return requestArray[1];
}).then(function(response1) {
    // do something with response1
    return requestArray[2];
}).then(function(response2) {
    // do something with response2
}).catch(function(failedResponse) {
    console.log("i will be displayed when a request fails (if ever)", failedResponse)
});

虽然有一个库解决方案会很好(根据@nstoitsev的回答),但您可以不用它来实现这一点

长度未知的顺序请求 简单回顾一下:

  • 我们不知道请求的数量
  • 每个响应都可能使另一个请求排队
一些假设:

  • 所有请求都将在一个公共数据对象上工作(在您的情况下为本地存储)
  • 所有的要求都是承诺
运行队列
函数后数据(数据){
返回$http.post(,数据)
}
var rqsts=[]
函数executeQueue(){
如果(!rqsts.长度)
//我们结束了
返回
var rqst=rqsts.shift()
rqst()
.然后(功能(rsp){
//根据您确定是否需要执行其他请求的方式。。。
如果(继续)
rqsts.push(postydata())
})
}
代码笔-

我故意把这个含糊不清,因为我不明白失败的条件是什么,如果您想改变请求以使用更多相同的
$http.post
调用,您可以通过某种方式将其传回

只是一个建议 作为一个有棱角的新手


很多事情都在朝着这个功能性的、反应式的编程范式发展。因为你对Angular比较了解,NG2已经有了一些内置的,这可能值得你注意。我想已经有很多NG2示例捆绑包了。

检查你是否可以利用ok,我会试试这个。但我的要求是相同的帖子要求st具有不同的post数据,我不知道有多少请求附加“then”到阵列。我使用“then”链递归调用负责在本地存储中仍有数据时进行http post的进程队列。如果本地存储中没有数据或post失败,我将中断该队列。感谢有关$q的提示。谢谢,我对$q做了类似的操作。