我有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/
没有一个人有完整的答案。
感谢所有人。
答案 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
});
}
}]);