使用$ routeProvider的promises来创建解析变量

时间:2015-07-24 21:02:46

标签: javascript angularjs angular-promise

我有3个工厂函数,我想链接在一起用于路径的解析节:

第一个函数是对$ http:

的简单REST调用
app.factory('services', ['$http', '$q', function ($http, $q) {
    var serviceBase = 'services/';
    var obj = {};
    obj.getSelect = function (db, table, columns, keys) {
        return $http.post(serviceBase + 'getSelect', {
            selectDB: db,
            selectTable: table,
            selectColumn: columns,
            selectKeys: keys
        }).then(function (results) {
            return results;
        });
    };

    // more objects follow
}

下一个函数只使用services.getSelect来检索一些记录:

app.factory('myFunctions', ['services', '$q',  function (services, $q) {    
    return {
        fGetData: function () {
            services.getSelect(
                'myDB',       // DB
                'tableInDB',  // Table
                "*",                // Columns
                ""                  // Keys
            ).then(
                function (retObj) {
                    return $q.all (retObj);
                    console.log('myFunctions.fGetData', retObj);
                }
            )
        }
    }
}]);

最后一个函数调用myFunctions.fGetData。其目的是将值返回到resolve节:

app.factory("getInitData",['myFunctions','$q', function (myFunctions, $q) {
    return function () {
        var initData = myFunctions.fGetData();

        return $q.all( {initData: results} ).then(function (results) {
            return {
                initDataReturn: results
            };
            console.log('getInitData', results);
        });
    }
}]);

最后是决心节:

app.config( ['$routeProvider', 'myConst', function ($routeProvider) {
    $routeProvider.when(myConst.adminButtonURL, {
        templateUrl: '/myTemplateURL',
        controller: myControler,
        resolve: {
                initDataObj: function(getInitData){
                    return getInitData();
            }
        }
    }
}]);

在控制器中返回initDataObj:

app.controller('myController', function ($scope, nitDataObj {

    $scope.surveyGroup = initDataObj.initData;

});

控制台日志总是显示'getInitdata'总是先触发,返回是一个空对象。

函数myFunctions.fGetData始终首先触发,并返回正确的数据。

错过引自He Haw的一首歌:“我在世界各地搜索过,我以为我会找到答案(true love是抒情的)”,但是有一些非常有趣的内容。线索包括

http://busypeoples.github.io/post/promises-in-angular-js/& http://www.dwmkerr.com/promises-in-angularjs-the-definitive-guide/

没有一个人有完整的答案。

感谢所有人。

1 个答案:

答案 0 :(得分:0)

好吧我认为部分原因与你使用$ q

的方式有关

$ q.all获取包含promises的数组或对象 https://docs.angularjs.org/api/ng/service/ $ Q

在您的服务工厂中,您正在解析承诺,然后返回结果

然后在myFunctions中你获取返回的值并试图将它提供给$ q.all,它不接受你给它的东西

看起来你想继续从每个工厂发回一个承诺,你可以做一些像

这样的事情
app.factory('services', ['$http', function ($http) {
    var serviceBase = 'services/';
    var obj = {};
    obj.getSelect = function (db, table, columns, keys) {
        return $http.post(serviceBase + 'getSelect', {
            selectDB: db,
            selectTable: table,
            selectColumn: columns,
            selectKeys: keys
        });
    };

    // more objects follow
}

app.factory("myFunctions", ["$q", "services", function($q, services){
    return {
        fGetData: function(){
            var deferred = $q.defer();

            services.getSelect()
                .success(function(results){
                    // do something with the data
                    deferred.resolve(results);
                });
            return deferred.promise;
        }
    };
}]);

app.factory("getInitData",['myFunctions', function (myFunctions) {
    return function () {
        myFunctions.fGetData()
            .then(function(data){
                // do something with the data
            });
    }
}]);