gpt4 book ai didi

javascript - 使用带有 $routeProvider 的 Promise 来创建解析变量

转载 作者:行者123 更新时间:2023-11-28 07:07:10 27 4
gpt4 key购买 nike

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

在 Controller 中返回 initDataObj:

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

$scope.surveyGroup = initDataObj.initData;

});

控制台日志始终显示“getInitdata”始终首先触发,并且返回的是空对象。

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

漏引用了 He Haw 的一首歌曲:“我寻遍了整个世界,我想我会找到答案(真爱是抒情诗)”,但是虽然有非常有趣的线索,包括

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

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

谢谢大家。

最佳答案

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

$q.all 接受一个包含 Promise 的数组或对象 https://docs.angularjs.org/api/ng/service/ $q

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

然后在 myFunctions 中,您获取返回值并尝试将其提供给 $q.all,但 $q.all 不接受您提供的内容

看起来你想继续从每个工厂发回 promise ,你可以做类似的事情

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

关于javascript - 使用带有 $routeProvider 的 Promise 来创建解析变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31619736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com