AngularJS dataservice using breezejs it not resolving the promise

[亡魂溺海] 提交于 2019-12-11 05:27:43

问题


I'm trying to setup a data service in my Angular application that is using breezeJS. After I resolve my promise I can't get the .then to file in my controller. I am getting data back from my database via breeze in my data service. I could just pass back the breeze promise but I want to be able to use $q.all to know when all my data has been found.

In my controller`

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

    }

`

The above then will not fire when the promise from the data service is fulfilled.

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

Any help would be greatly appreciated. I'm not 100% sure if I have the $q promises set up correctly. Eventually I would like to use a $q.all to determine when an array of various promises have been resolved to so I can update a message to the user. I've been reading that I need to use a timeout to get angular to realize that a change has happened in the next event loop.


回答1:


You're staring down the barrel of an Angular $q bug. You can read about it here if you wish.

That won't help nearly as much as following the advice in my answer to this related StackOverflow question in which I show and describe an adapter to get from Q.js promise to a $q promise.




回答2:


I have never used breeze but I think your problem is that you are not returning anything on the success callback..

  /***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.
         });

    }

Also the $timeout on the getAllStates function should not be necesary since angular resolves the promises asynchronously (it queues the resolution using $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;

}

Hope this could help you a little bit.

Regards,

Carles



来源:https://stackoverflow.com/questions/17819991/angularjs-dataservice-using-breezejs-it-not-resolving-the-promise

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!