【问题标题】:Calling multiple $http services in a for loop from Angularjs controller and services javascript promise issue从Angularjs控制器和服务javascript承诺问题在for循环中调用多个$http服务
【发布时间】:2016-04-06 16:52:39
【问题描述】:

我的 Angularjs 应用程序有一个控制器和服务 java 脚本。服务使用 $http 调用 WCF REST 服务。我需要根据 For 循环中使用的对象中的数据在 For 循环中调用多个服务。下面是场景:

“我想将几个文件上传到服务器上的文件夹并将文件名保存到数据库。我有一组用户选择上传的文件详细信息。我想验证数据库中已经存在的文件名(基于 EntityId)然后在上传到服务器之前重命名新文件。”下面是 for 循环和服务调用:

for (var i = 0; i < filesDataToUpload.length; i++) {

        var fileDataToUpload = filesDataToUpload[i];

        FileUploadService.GetUploadDetailsByEntityId(fileDataToUpload.ENTITY_ID).success(function (response) {
            $scope.UploadDetailsByEntity = response;
        });

        var newFileName = VerifyAndRenameBeforeSave(fileDataToUpload, $scope.UploadDetailsByEntity);

        FileUploadService.UploadFile(newFileName, fileData).success(function (data) {
            //some code
        }).error(function (error) {
            $scope.error("An error occured while uploading file -" + error.ExceptionMessage);
            isSuccess = false;
        });

        FileUploadService.InsertUploadDetails(FileUploadDetails).success(function (data) {
            //some code
        }).error(function (error) {
            $scope.error("An error occured while creating the Entity -" + error.ExceptionMessage);
            isSuccess = false;
        });

    }

问题: 问题:

我的问题是 - 我没有从第一个服务调用中得到响应,我想在后续验证和重命名文件以及保存到数据库的方法中使用该响应。我发现是因为 $http 的 promise 行为。所以我移动了我的文件验证和重命名方法,并将部分功能保存在

.success(function(response){
//verify that file does not already exists and rename it to the next number of file
//upload the file to the server

//Save new file name and other details to the database
}

但它仅适用于第一次,而不适用于 for 循环的下一次迭代。对于第二次迭代,它会检索第一个 EntityId 的记录。

我已经检查了thisthis

谁能帮我解决这个问题?

【问题讨论】:

    标签: javascript angularjs rest http angular-promise


    【解决方案1】:

    这是因为 .success 函数在实际等待异步任务的响应时返回了一个承诺。试试这样 -

    for (var i = 0; i < filesDataToUpload.length; i++) {
            var fileDataToUpload = filesDataToUpload[i];
            FileUploadService.GetUploadDetailsByEntityId(fileDataToUpload.ENTITY_ID).success(function (response) {
                $scope.UploadDetailsByEntity = response;
                var newFileName = VerifyAndRenameBeforeSave(fileDataToUpload, $scope.UploadDetailsByEntity);
    
                FileUploadService.UploadFile(newFileName, fileData).success(function (data) {
                        //some code
                        FileUploadService.InsertUploadDetails(FileUploadDetails).success(function (data) {
                                //some code
                        }).error(function (error) {
                                $scope.error("An error occured while creating the Entity -" + error.ExceptionMessage);
                                isSuccess = false;
                        });
                }).error(function (error) {
                        $scope.error("An error occured while uploading file -" + error.ExceptionMessage);
                        isSuccess = false;
                });
            });
    }
    

    【讨论】:

    • 感谢@atefth,我试过这样做,但我的 for 循环本身不会等待完成第一次迭代,然后在我的 .success 返回结果时完成。
    • 出于某些原因,我决定更改实现逻辑以避免此问题。我这样做如下:
    • 1.当用户选择要上传的每个文件时,将FileUploadService.GetUploadDetailsByEntityIdVerifyAndRenameBeforeSave 逻辑移动到即时发生(我想一次选择一个文件而不是多个文件)。这有助于我避免在 for 循环中执行有问题的服务调用。 2. 我将其余的 For 循环代码移到一个函数中。 ` angular.forEach(filesDataToUpload, function (fileDataToUpload) { loop(fileDataToUpload); }, 1000);`
    猜你喜欢
    • 2013-05-02
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2015-10-09
    • 2013-03-24
    • 2015-04-08
    • 2014-01-04
    相关资源
    最近更新 更多