使用 $q 链接 promise 返回函数数组

Chaining array of promise returning functions with $q

我有一个函数数组,其中每个函数 returns promise 来自 ajax 调用。

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 总是通过函数数组移动到成功。

我这是怎么了??

您正在将函数的引用推送到数组....未调用函数并推送 returned promise

尝试更改:

promises.push(uploadFile);

promises.push(uploadFile());

Upload.upload() 已经 return 时,使用 $q.defer(); is also an antipattern 创建一个新的承诺,您可以简单地 return 而不是