首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连锁http post

连锁http post
EN

Stack Overflow用户
提问于 2016-03-01 05:53:34
回答 3查看 3K关注 0票数 3

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

代码语言:javascript
复制
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);
}

作为角新手,我遇到了上述代码不连续的问题。我怎样才能实现我想要的呢?队列长度是未知的,并且随着进程的进行,队列长度也会增加。如果这是一个副本,请告诉我其他答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-01 07:50:58

Async.js听起来是个好主意,但如果你不想使用图书馆.

$q.all将批处理一个请求数组,并同时激发它们,并在数组中的所有承诺都解决时解决--这不是您想要的。

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

代码语言:javascript
复制
var request0 = $http.get('/my/path0');
var request1 = $http.post('/my/path1', {data:'fred'});
var request2 = $http.get('/my/path2');
var requestArray = [];

然后..。

代码语言:javascript
复制
requestArray.push(request0);
requestArray.push(request1);
requestArray.push(request2);

然后..。

代码语言:javascript
复制
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)
});
票数 3
EN

Stack Overflow用户

发布于 2016-03-01 17:12:14

虽然拥有一个库解决方案很好(per@nstoitsev的答案),但是没有它您也可以这样做。

长度未知的顺序请求

我只是简单地回顾一下:

  • 我们不知道请求的数量。
  • 每个响应都可以对另一个请求进行排队。

一些假设:

  • 所有请求都将处理公共数据对象(在您的情况下是本地存储)。
  • 所有的请求都是承诺

运行队列

代码语言:javascript
复制
function postMyData (data){
    return $http.post(<url>, data)
}

var rqsts = []

function executeQueue (){

    if(!rqsts.length)
         //we're done
         return

    var rqst = rqsts.shift()        
    rqst()
    .then(function(rsp){
        //based on how you're determining if you need to do another request...  
        if(keepGoing)
            rqsts.push(postMyData(<more data>))           
    })
}

codepen - http://codepen.io/jusopi/pen/VaYRXR?editors=1010

我故意让这个问题变得模糊,因为我不明白失败的条件是什么,而且如果您想改变请求以更多地使用相同的$http.post调用,您可以以某种方式将其传回。

只是一个建议

作为一个身材魁梧的新手..。

许多事情都在朝着这一整体功能的、反应性的编程范例发展。由于您是相对较新的角和NG2已经有一些内置的,它可能值得您注意。我认为rxjs已经出现在许多NG2示例包中。

票数 2
EN

Stack Overflow用户

发布于 2016-03-01 07:30:38

要实现这一点,最容易的方法是使用Async.js。在那里您可以找到一个名为mapSeries的方法。您可以在队列上运行它,它将依次处理数组的所有元素,并且只有在调用正确的回调时才会继续到下一个元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35715660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档