Служба данных AngularJS с использованием breezejs не выполняет обещание

Я пытаюсь настроить службу данных в своем приложении Angular, использующем breezeJS. После того, как я выполняю свое обещание, я не могу получить файл .then в своем контроллере. Я получаю данные из своей базы данных через ветер в моей службе данных. Я мог бы просто вернуть обещание бриза, но я хочу иметь возможность использовать $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;
};

Любая помощь будет принята с благодарностью. Я не уверен на 100%, правильно ли настроены обещания $q. В конце концов я хотел бы использовать $q.all, чтобы определить, когда массив различных обещаний был разрешен, чтобы я мог обновить сообщение для пользователя. Я читал, что мне нужно использовать тайм-аут, чтобы получить angular, чтобы понять, что изменение произошло в следующем цикле событий.


person pehaada    schedule 23.07.2013    source источник
comment
Не уверен, в чем проблема с вашими обещаниями, но в соответствии с угловым / тайм-аутом: достаточно установить тайм-аут на 1 мс. Нет необходимости устанавливать его на 200.   -  person idbehold    schedule 24.07.2013
comment
Я думаю, что могу даже оставить его выключенным, по умолчанию это 0 и необязательно. $timeout(function(){stateListQ.resolve(); } );   -  person pehaada    schedule 24.07.2013


Ответы (2)


Вы смотрите в ствол ошибки Angular $q. Вы можете прочитать об этом здесь, если хотите.

Это не поможет так сильно, как следование совету в мой ответ на этот связанный с StackOverflow вопрос, в котором я показываю и описываю адаптер для перехода от обещания Q.js к обещанию $q.

person Ward    schedule 23.07.2013
comment
Спасибо за помощь ! Я думал, что могу просто использовать Q.js вместо $q. На моей фабрике служб данных я только что определил обещание Q.js вместо обещания angular. вар myStatePromise = Q.defer(); Я не могу придумать ни одного недостатка, так как мне уже нужно применить изменения. - person pehaada; 24.07.2013
comment
... если я не хочу вручную разрешать обещание Q, я могу просто вернуть обещание Q, которое создает Breeze. вернуть manager.executeQuery (stateQuery) - person pehaada; 24.07.2013

Я никогда не использовал ветер, но я думаю, что ваша проблема в том, что вы ничего не возвращаете при успешном обратном вызове.

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

    }

Кроме того, $timeout для функции getAllStates не должен быть необходим, поскольку angular разрешает промисы асинхронно (он ставит разрешение в очередь, используя $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;

}

Надеюсь, это может помочь вам немного.

С уважением,

Карлес

person Carlos Serrano    schedule 23.07.2013