1

我正在尝试在我的 Angular 应用程序中设置一个数据服务,该应用程序使用的是 BreadJS。在我兑现承诺后,我无法将 .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 来确定何时解决了一系列不同的承诺,以便我可以更新给用户的消息。我一直在阅读我需要使用超时来获得角度来意识到在下一个事件循环中发生了变化。

4

2 回答 2

4

你正盯着一个 Angular $q 错误的桶。如果你愿意,你可以在这里阅读。

这与遵循我对这个相关 StackOverflow 问题的回答中的建议没有多大帮助,在该问题中我展示并描述了从 Q.js 承诺到 $q 承诺的适配器。

于 2013-07-23T21:23:32.283 回答
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 异步解析承诺(它使用 $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;

}

希望这可以帮助你一点点。

问候,

卡尔斯

于 2013-07-23T21:50:18.100 回答