AngularJS 承诺数组

AngularJS Array of Promises

任何人都可以帮我一些 Angular promises 吗?我有以下函数,它们应该接收一组文件对象,遍历它们,然后上传每个文件对象。在每次迭代期间,一个 promise 对象被推送到 promises 的数组中。在我的 upload 函数中,我有一个附加了 .then()cycle 函数,在所有 promise 对象都已解析之前不应调用该函数。我认为我的代码看起来是正确的,但它不能正常工作。图片上传,但立即调用 cycle(files).then(),而不是在 promises 数组解析后调用。

function upload(files) {
    var uploadCount = files.length;
    function cycle(files) {
        var promises = [];
        for (var i = 0; i < files.length; i++) {
            var deferred = $q.defer();
            promises.push(deferred);
            var file = files[i];
            Upload.upload({
                url: '/photos.json',
                file: file
            }).success(function(){
                $scope.progressCurrentCount += 1;
                deferred.resolve();
            });
        };
        return $q.all(promises);
    };

    cycle(files).then(function(result) {
        if(uploadCount > 1) {
            $scope.lastAction = 'uploaded ' + uploadCount + ' photos';
        } else {
            $scope.lastAction = 'uploaded ' + uploadCount + ' photo';
        }
        $scope.showSuccessModal = true;
        $scope.uploading = false;
        $scope.failedUploads = [];
        $scope.newPhotos = {
            token: $scope.token,
            files: undefined
        };
        photoUploadBtn.removeClass('disabled');
    })
};

最终工作代码*

而不是设置 var deferred = $q.defer();deferred.promise 推入 promises 数组,然后在我的 .success() 回调中解析 deferred,这是行不通的,我只是将没有 .success() 回调的 Upload.upload() 函数推送到 promises,然后将其传递给 $q.all(),它完成所有提升。

function upload(files) {
    var uploadCount = files.length;
    function cycle(files) {
        var promises = [];
        for (var i = 0; i < files.length; i++) {
            var file = files[i];
            var promise = Upload.upload({
                url: '/photos.json',
                file: file
            });
            promises.push(promise);
        };
        return $q.all(promises);
    };

    cycle(files).then(function(result) {
        if(uploadCount > 1) {
            $scope.lastAction = 'uploaded ' + uploadCount + ' photos';
        } else {
            $scope.lastAction = 'uploaded ' + uploadCount + ' photo';
        };
        $scope.showSuccessModal = true;
        $scope.uploading = false;
        $scope.failedUploads = [];
        $scope.newPhotos = {
            token: $scope.token,
            files: undefined
        };
        photoUploadBtn.removeClass('disabled');
        getPhotos(q);
    })
};

您必须将承诺而非延迟推送到 promises 数组:

promises.push(deferred.promise);

如果你这样想会有所帮助:

  • promise 是您想要 return 给消费者的只读对象
  • deferred 是该只读承诺的修饰符,您想自己保留它