Javascript 使用$routeProvider的承诺创建解析变量
我有3个工厂功能,我希望将它们链接在一起,以便在路线的解析节中使用: 第一个函数是对$http的简单REST调用: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
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)将在具有其他视图的其他控制器中使用,在本例中,用于在创建控制器之前对其进行种子设定。