2014-02-24 119 views
1

我正在開發使用AngularJS & PersistenceJS的應用程序。AngularJS Defer.promise工作不正常

我得到處理異步調用麻煩的

控制器

cars.controller('CrashWidgetOneCtrl',function($scope, $location, $routeParams, CrashServices){ 
    if($routeParams.crashId){ 
     $scope.data = {}; 
     console.log("CrashID: "+$routeParams.crashId); 
     crashId = $routeParams.crashId; 
     alert(1);//Works 

     CrashServices.getCrashDetails($scope, crashId).then(function(result){ 
      console.log(result); 
      alert(2);//Never Fires 
     });  
    alert(3);//Gets executed 
    }else{ 
     console.log("N"); 
    } 

}); 

服務

cars.factory('CrashServices', function($http, $location, $q, CommonServices,$rootScope, $timeout){ 
    return{ 
     getCrashDetails:function($scope, crashId){ 
     var deferred = $q.defer();   
     // Get user details if any 
     $scope.$apply(function(){ 
      var crashInfoTable = App.CrashInfoTable.all(); 
      alert(4); 
      crashInfoTable.list(null, function (results) { 
       alert(5);//This also doesn't work 
       deferred.resolve(); 
      }); 
     }); 
     return deferred.promise; 
     } 
    } 

}); 

任何幫助將不勝感激。非常感謝。

注意:我正在使用PersistenceJS。

+1

我猜App.CrashInfoTable.all()也是一個異步調用。什麼是resturn類型?還有一個承諾? – michael

+1

如果crashInfoTable的回調沒有被調用,那麼promise就不會被解析。所以Defer.promise確實按預期工作。它不會觸發成功回調函數直到解決。模型可能有問題嗎?看看這個鏈接https://groups.google.com/forum/#!topic/persistencejs/eIfuqyXK09E –

+0

@michael:App.CrashInfoTable.all()不是異步的..林不知道返回類型...如何我可以知道嗎? –

回答

1

我不知道你是否需要scope.apply。 這似乎適用於我:

getCrashDetails:function($scope, crashId){ 
    var deferred = $q.defer();   
    // Get user details if any 
    App.CrashInfoTable.all().list(null, function(results) { 
     deferred.resolve(results); 
    }); 
    return deferred.promise; 
} 
+0

是的..這真的是我最終做的..這是回來..;)...雖然..感謝..讚賞它.. –

+1

...像一個鳳凰從骨灰;)認爲它可能會幫助某人其他誰有同樣的問題。 – TimoSolo

+0

正是我爲什麼接受它;)..乾杯。 –