我正在尝试在使用breezeJS的Angular应用程序中设置数据服务。在我解决了我的承诺后,我无法让.then在我的控制器中存档。我通过数据服务中的breeze从数据库中获取数据。我可以简单地传回微风承诺,但我希望能够使用$ q.all知道我的所有数据何时被找到。
在我的控制器中
ProApp.controller( 'caseInfoController', function caseInfoController($ scope,$ log,$ timeout,caseDataService){
/***initialize data ***/
// initializeApp();
ATPinitializeApp();
function ATPinitializeApp() {
$scope.MyStateList= caseDataService.getAllStates()
.then(function assignStates(data) {
$log.info("THIS THEN WILL NOT FIRE");
});
}
`
当满足数据服务的承诺时,上述内容将不会触发。
ProApp.factory('caseDataService', function ($log, $q)
{
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
var servicename = "http://localhost:60882/breeze/SPLBreeze";
var manager = new breeze.EntityManager(servicename);
var caseDataService =
{
getAllStates: getAllStates,
};
return caseDataService;
/*** implementation details ***/
function getAllStates()
{
var myStatePromise = $q.defer();
var query = breeze.EntityQuery
.from("state");
manager.executeQuery(query)
.then(function (data) {
$timeout(function () { myStatePromise.resolve(data); }, 200);;
});
return myStatePromise.promise;
};
非常感谢任何帮助。我不是百分百肯定我是否正确设置了$ q承诺。最后我想使用$ q.all来确定何时解决了各种promise的数组,以便我可以向用户更新消息。我一直在读,我需要使用超时来获得角度,以便意识到在下一个事件循环中发生了变化。
答案 0 :(得分:4)
你正盯着一个Angular $ q bug的桶。如果您愿意,可以阅读here。
这几乎没有像my answer to this related StackOverflow question中的建议那样有用,我在其中展示并描述了从Q.js承诺到$ q承诺的适配器。
答案 1 :(得分:0)
我从来没有使用微风,但我认为你的问题是你没有在成功回调中返回任何东西..
/***initialize data ***/
. . .
function ATPinitializeApp() {
$scope.MyStateList= caseDataService.getAllStates()
.then(function assignStates(data) {
$log.info("THIS THEN WILL NOT FIRE");
return data; // If you don´t return anything nothing will be added to the scope.
});
}
此外,getAllStates函数的$ timeout不应该是必需的,因为angular异步解析promises(它使用$ rootScope对分辨率进行排队。$ evalAsync)
function getAllStates()
{
. . .
manager.executeQuery(query)
.then(function (data) {
// I believe the $timeout that was in this function is not necessary
myStatePromise.resolve(data);
});
return myStatePromis
e.promise;
}
希望这可以帮助你一点点。
此致
卡尔斯