【问题标题】:AngularJS Array of PromisesAngularJS 的承诺数组
【发布时间】:2015-09-21 13:37:54
【问题描述】:

谁能帮我做一些 Angular 的承诺?我有以下函数,它们应该接收一组文件对象,遍历它们,然后上传每个对象。在每次迭代中,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,这不起作用,我只是推我的Upload.upload() 函数而不使用@ 987654334@ 回调到 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);
    })
};

【问题讨论】:

    标签: angularjs angular-promise


    【解决方案1】:

    您必须将一个承诺而不是延迟推入promises 数组:

    promises.push(deferred.promise);
    

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

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

    【讨论】:

    • 谢谢,这是我需要的大部分解决方案!我还遇到了this article,这让我意识到我应该以稍微不同的方式处理事情。我会把我的最终代码放在上面的帖子中。
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多