【问题标题】:Chaining array of promise returning functions with $q用 $q 链接承诺返回函数的数组
【发布时间】:2017-05-11 10:58:51
【问题描述】:

我有一个函数数组,其中每个函数从 ajax 调用返回 promise

var promises = [];
if (form.$valid) { 
  Object.keys($scope.Model.Data.FormFiles).forEach(function (key) {
    var file = $scope.Model.Data.FormFiles[key];

    function uploadFile(){
        var deferred = $q.defer();
        var upload = Upload.upload({
            url: "/api/ir/funnelApi/UploadFile",
            data: { file: file }
        });

        upload.then(function (response) {                           
                // do something
                deferred.resolve(response.statusText);
            }, function (error) {
                deferred.reject(error.data);
            }, function (evt) {

        });             
        return deferred.promise;
    }       

    promises.push(uploadFile);
  });   
}

我要做的是,如果所有文件都已成功上传,然后做点什么。

$q.all(promises).then(function (responses) {                    
   // do something
}, function (errors) {
   // if any of the file upload fails, it should come here  
});

但问题是 ajax 从未触发$q.all 总是通过函数数组移动到成功。

我做错了什么??

【问题讨论】:

  • 它会进入deferred.resolve(response.statusText); 吗?试着把console.log()放在那里
  • 为了使父 Promise 工作必须被解决或拒绝,你能发布 Ajax 请求代码
  • 似乎没有从任何地方调用uploadFile函数。您需要调用该函数。

标签: javascript angularjs ajax promise q


【解决方案1】:

您正在将函数的引用推送到数组....而不是调用函数并推送返回的承诺

尝试改变:

promises.push(uploadFile);

promises.push(uploadFile());

Upload.upload() 已经返回一个promise 时,使用$q.defer(); is also an antipattern 创建一个新promise,而您可以简单地返回它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2023-01-27
    • 2017-09-16
    • 2018-02-15
    相关资源
    最近更新 更多