Javascript 使用$routeProvider的承诺创建解析变量

Javascript 使用$routeProvider的承诺创建解析变量,javascript,angularjs,angular-promise,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 $ht

我有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。其目的是将值返回到“解析”节:

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();
            }
        }
    }
}]);
最后是“决心”一节:

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始终首先启动,并返回正确的数据

引用何唧的一首歌:“我已经搜索了全世界,我想我会找到答案(
真爱
是抒情的)”,但尽管有一些非常有趣的线索,包括

&

没有什么能给出完整的答案


谢谢大家。

好的,我认为这部分与您使用$q的方式有关

$q.all接受一个数组或包含承诺的对象 $q

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

然后在myFunctions中,您获取返回值并尝试将其赋给$q。所有这些函数都不接受您所赋的值

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

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
            });
    }
}]);

好的,我认为这部分与你使用$q的方式有关

$q.all接受一个数组或包含承诺的对象 $q

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

然后在myFunctions中,您获取返回值并尝试将其赋给$q。所有这些函数都不接受您所赋的值

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

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
            });
    }
}]);

在正确的轨道上,但无需在
fGetData
中创建新承诺,因为
服务。getSelect
已返回
$http
承诺。被认为是反模式的。1) 从“服务”工厂中删除“.then”块,使函数getSelect具有承诺的函数(使用“then”,承诺对象将被删除..2)使用延迟方法。-谢谢。但是如果在将数据传递给getInitData之前需要对数据进行解析和操作,则需要创建一个新的承诺。这就是我正在尝试做的。中间函数(fGetData)将在具有其他视图的其他控制器中使用,在本例中,用于在创建控制器之前对控制器进行种子设定。在正确的轨道上,但无需在
fGetData
中创建新承诺,因为
服务。getSelect
已返回
$http
承诺。被认为是反模式的。1) 从“服务”工厂中删除“.then”块,使函数getSelect具有承诺的函数(使用“then”,承诺对象将被删除..2)使用延迟方法。-谢谢。但是如果在将数据传递给getInitData之前需要对数据进行解析和操作,则需要创建一个新的承诺。这就是我正在尝试做的。中间函数(fGetData)将在具有其他视图的其他控制器中使用,在本例中,用于在创建控制器之前对其进行种子设定。