$ q.all不等待promise数组返回/拒绝

时间:2018-07-11 14:17:24

标签: javascript angularjs angular-promise

我有点不知所措,因为从我在文档中阅读的内容来看,这应该可以正常工作。我有3种需要保存的表格。第三个需要等待它们出现的前两个IF,因为它需要返回其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";
     });
};

2 个答案:

答案 0 :(得分:1)

The Promise API - Angular 1.x docs

  

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

     

此方法返回一个新的诺言,即 ...

在第1-2行,您将.then()方法附加到诺言,有效地创建了新的诺言。我可能是错的,但是由于样本中没有其他“错误”,因此应该是线索。

答案 1 :(得分:0)

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