【问题标题】:$q.all not waiting for promise array to return/reject$q.all 不等待承诺数组返回/拒绝
【发布时间】:2018-07-11 14:17:23
【问题描述】:

我有点不知所措,因为从我在文档中阅读的内容来看,这应该可以正常工作。我有可能需要保存 3 种表格。第三个需要等待前 2 个如果它们存在,因为它需要返回它们的 id。我有以下设置:

var recProm = user.saveData(...).then(function(response)){...}
var stdProm = user.saveData(...).then(function(response)){...}

if(recProm) promise_array.push(recProm);
if(stdProm) promise_array.push(stdProm);

$q.all(promise_array).then(function(response)) {...}

然而,$q.all 永远不会等待承诺解决。我看到正确的承诺在数组中,但是当代码完成时它只是重定向回主页。

我不确定我在这里做错了什么,因为我正在向 $q.all 传递一系列承诺,就像文档要求的那样。任何帮助将不胜感激。

更新:saveData的代码如下:

 this.saveData= function (list, model, successMsg, errorMsg) {
       return $.ajax({
           method: 'POST',
           url: SPUrl + "/_api/web/lists/getByTitle('" + list + "')/items",
           contentType: "application/json; odata=verbose",
           headers: {
                     "X-RequestDigest": $rootScope.formRequestDigest,                       
                     "Accept": "application/json; odata=verbose"                        
                    },
           dataType: 'text json',
           data: JSON.stringify(model),
           timeout: 0
        }).then(function (data, request) {
           successMsg !== undefined && successMsg !== null ? alertify.success(successMsg) : null;
           return data.d;
       }, function (error) {
          console.log(error);
          errorMsg ? alertify.error(errorMsg + ' Error: ' + error.name + ' Status: ' + error.status) : null;
          return "error";
     });
};

【问题讨论】:

  • 您可以尝试使用deffered = $q.defer() 并使用promise_array.push(deffered.promise); 推送延迟承诺(在.then 中解析为deffered.resolve(...);)。 每个 http 请求使用一个延迟
  • 所以我会做 recProm = $q.defer() 然后在 user.saveData(..).then(function(response){ $q.resolve(recProm);}?
  • 无需使用$q.defer()。问题的可能原因是您未能返回在 .then 块中创建的链式承诺。我们需要查看更多代码来理解问题。否则,我将投票结束这个问题,因为“不清楚你在问什么。”
  • 问题不包含任何错误代码时,很难回答有关代码错误的问题。为了帮助解决问题,回答者是将不得不看看代码是什么。 “它似乎不起作用”没有帮助
  • jQuery .ajax 方法返回的 promise 没有与 AngularJS 框架及其摘要循环集成。相反,请使用 AngularJS $http 服务。此外,众所周知,jQuery 承诺存在问题。见You're Missing the Point of Promises

标签: javascript angularjs angular-promise


【解决方案1】:

The Promise API - Angular 1.x docs

then(successCallback, [errorCallback], [notifyCallback]) – 无论承诺何时被解决或被拒绝,...

这个方法返回一个新的promise,它是...

在第 1-2 行,您将 .then() 方法附加到 Promise,从而有效地创建一个新的 Promise。我可能是错的,但由于样本没有其他“错误”,这应该是线索。

【讨论】:

  • 如果.then 块中的函数未能包含return statement,新的promise 将立即解析为undefined
  • @georgeawg 这是问题的一部分,在重新加载页面之前甚至没有到达 .then 部分。 .then 确实有返回它。
  • 显示页面重新加载的代码在哪里?当问题不包含任何错误代码时,很难回答有关代码错误的问题。
  • @georgeawg 它在使用 ng-submit 的表单中,所以我假设一旦到达代码末尾,它会根据提交按钮功能发生的情况重新加载,也许我应该将其更改为输入="button" 看看会发生什么
【解决方案2】:

好的,问题是我需要将按钮类型从“提交”更改为“按钮”以等待承诺解决。我不确定为什么会这样,但是一旦它到达带有按钮类型“提交”的代码末尾,它就会重新加载页面而无需等待。一旦我将按钮类型更改为“按钮”,promise 就会按预期工作,同时使用 $q.all 和 $.when.apply。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2021-10-14
    • 2018-11-20
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    相关资源
    最近更新 更多