使用$ q和deferred.notify与$ http调用

时间:2015-12-23 21:12:46

标签: javascript angularjs angular-promise

我正在尝试构建$http.get['Thing1', 'Thing2', 'Thing3', ...]个请求,然后让它们通过它们,并在此过程中获得进度通知。

我对如何做到这一点有一般的想法,但由于某种原因,我最终得到了所有20个HTTP调用并同时返回。通知永远不会运行。

基本上是for和Things of Things {{1}}我想创建一个$ http.get请求。虽然正在执行这个$ http调用数组,但我希望获得当前进度(1/3完成),直到完成所有操作然后再运行一个函数。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

伪代码

flags = 0

rqsts = [

    $http.get(url1)
    .then (rsp)->
        flags++
        rsp.data.data
    .catch (err)-> 
        # key here is to NOT reject but pass a successful failure
        # otherwise $q.all will bomb out
        err

    .....

    $http.get(urlN)
    .then (rsp)->
        flags++
        rsp.data.data
    .catch (err)-> 
        # key here is to NOT reject but pass a successful failure
        # otherwise $q.all will bomb out
        err
]

$q.all(rqsts)

然后在你的UI中你可以看到rqsts.length上的标志,看看有多少已完成。

修改

我添加了一个示例,说明如何解决/拒绝单个请求增加计数器,而某些计数器仍处于待处理状态。这是在coffeescript&玉\ö/

codepen - http://codepen.io/jusopi/pen/admNmm?editors=101

要清楚

在各种评论和其他答案中都有说明:

  

作为@jusopi的评论,值得注意的是每次响应获得成功结果时都会调用最后一个回调(通知回调)。

     

此外,在解决或拒绝承诺之前,可以将通知回调调用零次或多次以提供进度指示。

这仅适用于承诺的单一实例。在问题的上下文中,只有在所有服务器请求已解决后才会触发此通知。它不会为每个服务器请求触发通知,因为这是所述服务器请求的责任。

以下是相关问题/答案 - https://stackoverflow.com/a/28322945/1121919

答案 1 :(得分:-1)

根据文件

  

然后(successCallback,errorCallback,notifyCallback) - 无论何时或将要解析或拒绝承诺,然后在结果可用时立即异步调用其中一个成功或错误回调

所以基本上让我们有一堆承诺

var req1 = $http.get('url1');
var req2 = $http.get('url2');
var req3 = $http.get('url3');
var req4 = $http.get('url4');
//do stuff when all of them are resolved
var promiseArray = [req1, req2, req3, req4];
$q.all(promiseArray).then(function(successResponse){ //success callback - it's ok
    //do stuff with my success execution
}, function(errorResponse){ //error callback - it has errors
    //throw exception
}, function(notificationResponse){ //notification callback - do stuff while executing
    //notify my stuff execution
});

就是这样。死简单

作为@jusopi的评论,值得注意的是每次响应获得成功结果时都会调用最后一个回调(通知回调)。

  

此外,在解决或拒绝承诺之前,可以将通知回调调用零次或多次以提供进度指示。

如需进一步阅读,请参阅此link