2013-08-08 2 views
1

Я разрабатываю приложение Angular (в CoffeeScript) и имею небольшой PHP-сервер (да, я знаю), который служит обещанием либо для кешированной версии (из файла), либо из базы данных.Угловое обещание завода не будет корректно решено

Я написал фабрику для этого:

@myApp.factory 'apiModel', ($http, $q) -> 
    deferred = $q.defer() 
    apiData = null 

    getData = (fromDb) -> 
     fromDb = (fromDb == true) 
     url = 'api.php?do=get'; 

     # Append &refresh to get from database 
     if fromDb then url += '&refresh'; 

     $http.get(url).success (data) -> 
      apiData = data 
      deferred.resolve data 
     .error -> 
      deferred.reject e.what() 


    return { 
     get: (fromDb) -> 
      if apiData == null || fromDb == true then getData(fromDb) 
      else deferred.resolve(apiData) 

      return deferred.promise 
    } 

я могу получить данные просто:

apiPromise = apiModel.get() 
apiPromise.then (data) -> 
    $scope.updateData(data) 
, (reason) -> 
    console.log reason 

Это прекрасно работает, до сих пор.

Тогда я хочу, чтобы обновить данные жить, как это:

$scope.refreshData = -> 
    promise = apiModel.get(true) # get from DB 
    promise.then (data) -> 
     $scope.updateData(data) 
    , (reason) -> 
     console.log reason 

Который не работает. Когда я регистрирую ответ в getData(), он отображает правильные обновленные данные, но когда я регистрирую данные из обещания (в $scope.refreshData()), он показывает старые данные.

Я думаю, что это проблема с асинхронным запросом (он регистрирует данные по promise.then перед данными из getData()), но для этого есть обещания, не так ли?

Заранее спасибо

+2

проблема приходит, потому что вы оставляете deffered как глобальный объект будет разрешена только один раз, так, чтобы избежать этого вы должны объявить отложили внутри функции ПОЛУЧИТЬ не на глобальном уровне –

+0

@Ajaybeniwal это было. Большое спасибо. –

+0

@Ajaybeniwal добавить это как ответ тогда :) – Chandermani

ответ

0

Проблема приходит, потому что вы оставляете deffered как глобальный объект будет разрешен только один раз, так, чтобы избежать этого, вы должны DECLARE отложили внутри функции ПОЛУЧИТЬ не на глобальном уровне

Смежные вопросы