javascript - Angularjs $http 使用 $q.defer 返回未完成的结果

标签 javascript angularjs angular-promise angular-http

我有一个 Angular 问题,即使我正在使用 $q.defer 功能,结果也会在实际完成之前返回到我的 Controller 。我的服务中有以下功能

      getFileInfo : function (fulfillmentId)
        {
            var pdfResults = [];
            var jpgResults = [];
            var orderDetails = {};
            var deferred = $q.defer();


            $http.get(appConstants.api_url + '/references/' + fulfillmentId + '/files?max=2000')
                . then (function (fileResults)
                {
                    angular.forEach(fileResults.data.entities,function(value)
                    {
                        if(value.file.extension == 'pdf')
                        {
                            pdfResults.push({files : value});

                        }

                        if(value.file.extension == 'jpg')
                        {
                            jpgResults.push({files : value});
                        }
                    });

                    orderDetails.jpgResults = jpgResults;

                    return pdfResults;

                })
                .then (function (pdfResults)
                {
                    angular.forEach(pdfResults,function(value,key)
                    {

                        var fileUuid = value.files.file.file_uuid;

                        return $http.get(appConstants.api_url + '/resources/' + fileUuid + '/tags')
                            .then (function (preflightResults)
                        {

                            var deserializeJson = [];
                            deserializeJson.push(angular.fromJson(preflightResults.data.entities[0].resource_json));
                            var formatedPreflightResults = localAPI.addUIMessages(deserializeJson);

                            pdfResults[key].preflightResults = formatedPreflightResults;
                        });

                    });

                    orderDetails.pdfResults = pdfResults;

                    deferred.resolve(orderDetails);
                });


            return deferred.promise;


        }

我从我的 Controller 调用它,如下所示:

 conformAPI.getFileInfo($scope.fulfillmentId)
        .then (function (results)
        {
            console.log(results);
            console.log(results.pdfResults[0]);
            console.log(results.pdfResults[0].preflightResults)

        });

我遇到的问题是我所做的最后一个控制台日志显示为未定义。其他一切都返回良好的结果。第一个和第二个控制台类似有 preflightResults 对象,但看起来它添加得有点晚了。我认为通过使用 $q.defer 在一切完成之前不会返回任何内容。关于如何解决这个问题有什么想法吗?

最佳答案

看来您没有等待“getFile”获取请求的结果。 我稍微重构了你的代码。它可能不起作用,因为我无法运行它,但你应该明白我的观点。

getFileInfo: function (fulfillmentId) {

var pdfResults = [];
var jpgResults = [];
var orderDetails = {};
var deferred = $q.defer();

function getByFileId(fileUuid, preflightResults) {

    return $http.get(appConstants.api_url + '/resources/' + fileUuid + '/tags')
        .then(function (preflightResults) {
        var deserializeJson = [];
        deserializeJson.push(angular.fromJson(preflightResults.data.entities[0].resource_json));
        var formatedPreflightResults = localAPI.addUIMessages(deserializeJson);

        return formatedPreflightResults;
    });
}

function getFiles(pdfResults) {

    var subDefer = $q.defer();
    var current = 0;

    angular.forEach(pdfResults, function (value, key) {
        current += 1;
        var fileUuid = value.files.file.file_uuid;

        getByFileUuid(fileUuid, preflightResults)
            .then(function (results) {

            pdfResults[key].preflightResults = results;

            // need to know when done with all
            if (pdfResults.length === current) {
                subDefer.resolve(pdfResults);
            }
        });
    });

    return subDefer.promise;
}

$http.get(appConstants.api_url + '/references/' + fulfillmentId + '/files?max=2000')
.then(function (fileResults) {

    angular.forEach(fileResults.data.entities, function (value) {

        if (value.file.extension == 'pdf') {
            pdfResults.push({ files: value });
        }

        if (value.file.extension == 'jpg') {
            jpgResults.push({ files: value });
        }
    });

    orderDetails.jpgResults = jpgResults;
    return pdfResults;

}).then(getFiles).then(function(pdfResults) {

    orderDetails.pdfResults = pdfResults;
    deferred.resolve(orderDetails);
});

return deferred.promise;

}

关于javascript - Angularjs $http 使用 $q.defer 返回未完成的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27305311/

相关文章:

angularjs - 在nodejs环回中安排一个cron作业

javascript - 当服务器宕机时,不会返回错误

javascript - 使用 angularjs 对特定两个字段进行 ng-repeat 搜索?

javascript - 定义自定义 Javascript 函数的回调

javascript - 如何在 Jest 测试中调用 native console.log 方法?

javascript - 如何获取页面滚动位置(y轴)

javascript - AngularJS $q 服务是否支持 .then(undefined) 作为空操作

javascript - 如何使用 Angularjs Promise 正确获取变量

javascript - 处理ajax请求的流程控制(即仅在上一个请求完成后处理下一个请求)

javascript - async.js 的 waterfall 方法在调用 Mongoose 保存方法时挂起