【问题标题】:AngularJs. Using $q.all for sending multiple post requestsAngularJs。使用 $q.all 发送多个 post 请求
【发布时间】:2015-12-05 09:19:22
【问题描述】:

我有一个 AngularJs 应用程序,我需要在其中循环调用 $http。这是我的代码:

          var promisesArray = [];
          for(i = 0; i < 28; i++) {
                 promisesArray.push($http({
                    method: "post",
                    url: "/studentanswers",
                    data: {
                        studentName: "abc",
                        answerImage: "sdf",
                        questionPrompt: 1
                    }
                }));
          }
          $q.all(promisesArray).then(function(data){
              console.log("success!!!!");
          });

由于某种原因,它没有发布集合中的所有项目。我知道浏览器通常不允许超过 6 个异步 post 调用。据我了解,$q.all 是一种解决方法。此外,即使我注释掉 $q.all 部分,也没关系,因为 post 调用仍然会执行。

我将非常感谢任何帮助!

【问题讨论】:

  • 开发者工具中的网络标签是什么样子的?
  • 我打印出了错误响应。这是我得到大约 10 或 11 次的结果: Object {data: null, status: -1, config: Object, statusText: ""}
  • 另外,我之前问过这个问题,这导致我访问 $q.all:stackoverflow.com/questions/33949265/…
  • 错误信息对我没有帮助。您可以在开发人员工具中打开网络选项卡以显示正在发送的请求吗?您需要确保您尝试走正确的路线。在这个问题中,我认为$q.all 与您的问题没有任何关系(即您的代码看起来不错)。
  • 在发布另一个问题之前,您似乎没有测试您在原始问题中接受的解决方案。我同意接受的回答者回复的这一部分:“更好的方法是修改您的端点以获取集合,或者创建一个新的端点”。 $q.all 只是一个实现细节,但并不能解决问题。

标签: angularjs post promise angular-promise


【解决方案1】:

请注意,$q.all没有弹性。它将以第一个被拒绝的承诺终止。但这真的不是你的问题。

您需要链接您的帖子以避免同时发帖的浏览器限制。

var promisesList = [];
var promiseMinusOne = $q.when();

for (var i = 0; i < 28; i++) {
    //begin IIFE closure
    function(i) {
        //chain off promiseMinusOne
        var httpPromise = 
             promiseMinusOne.catch (function (e) {
                 return e;
             }) .then (function (r) {
                 return $http({ method: "post",
                                url: "/studentanswers",
                                data: answerList[i]
                 })
             });
        promisesList.push(httpPromise);
        promiseMinusOne = httpPromise; 
    }(i);
    //end IIFE closure
};

var chainablePromise = 
    promiseMinusOne.catch (function (e) {
        return (e);
    }) .then (function (r) {
        //process the promisesList
    });

注意,对于promiseMinusOne,使用.catchreturn 以便在其中一项被拒绝时继续列表。

【讨论】:

  • 对于这么晚的回复,我深表歉意。我最近重新开始了这个项目。就是这样!现在它工作得很好。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2014-02-19
  • 2014-04-16
  • 2016-12-26
  • 2013-09-24
  • 2013-10-06
相关资源
最近更新 更多