-1

Promise 无法正常工作saveService在 promise 解决之前被调用意味着所有文档都已上传,但是当我在saveService中记录数据时,它显示上传的文档无法找出问题,请让我知道我错在哪里

//file upload
$scope.fileObj = {};
$scope.documentUploaded = [];
var uploadFile = function (type) {

    var file = $scope.fileObj[type];

    //service to upload file
    fileService.uploadDocument(file)
        .success(function (data, status) {

            console.log("uploaded successfully", data);

            $scope.documentUploaded.push({
                doc: {
                    fileName: data.name,
                    path: data.path
                }
            });

        })
        .error(function (data, status) {

        });          
}


$scope.save = function () { //on click of submit, save() is called

var defer = $q.defer();
var promises = [];        

//looping to upload files       
angular.forEach($scope.documentList, function (doc) {

    if ($scope.fileObj[doc.type]) {
       promises.push(uploadFile(doc.type));                
    }            
});

//this will save data when promise will get complete
var saveData = function () {
    var dataToSave = {
        //other fields
        documents: $scope.documentUploaded
    };

    saveService.saveApi(dataToSave)
        .success(function () {
            defer.resolve('data saved');                    
        })
        .error(function () {
            defer.reject("something went wrong");                    
        });
}

$q.all(promises).then(saveData);
return defer;         

}

4

1 回答 1

4

uploadFile()需要返回一个承诺(当它的工作完成时解决)$q.all(promises)才能工作。

现在它没有返回任何东西,所以你传递$q.all()了一个未定义值的数组。由于该数组中没有承诺,因此立即$q.all()执行.then()处理程序。

这是问题的精简版:

var promises = [];
...forEach(function() {
    promises.push(uploadFile(doc.type)); 
});
$q.all(promises).then(saveData);

因此,您将返回值从uploadFile(). 但uploadFile()甚至不返回任何东西。所以,你在推undefined。然后,您将一组undefined值传递给$q.all它期望一组承诺的时间。

因此,为了使这个逻辑工作,您需要uploadFile()返回一个在该实例uploadfile()完成其异步工作时得到解决的承诺。


如果fileService.uploadDocument()已经返回一个承诺,你可以只返回那个承诺。如果没有,那么您可以在开头创建一个uploadFile()并在结尾返回它,然后在.success()and.error()处理程序中解析或拒绝它。


如果fileService.uploadDocument()已经可以做出承诺,那么首选的解决方案是使用该承诺(我不知道那个 API,所以不知道它是如何工作的)。如果它不能做出承诺,那么你可以像这样做出自己的承诺:

var uploadFile = function (type) {
    var defer = $q.defer();
    var file = $scope.fileObj[type];

    //service to upload file
    fileService.uploadDocument(file)
        .success(function (data, status) {
            console.log("uploaded successfully", data);
            $scope.documentUploaded.push({
                doc: {
                    fileName: data.name,
                    path: data.path
                }
            });
            defer.resolve();

        })
        .error(function (data, status) {
            defer.reject();
        });          
    return defer.promise;
}
于 2014-08-11T10:08:19.650 回答