Я разрабатываю приложение 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()
), но для этого есть обещания, не так ли?
Заранее спасибо
проблема приходит, потому что вы оставляете deffered как глобальный объект будет разрешена только один раз, так, чтобы избежать этого вы должны объявить отложили внутри функции ПОЛУЧИТЬ не на глобальном уровне –
@Ajaybeniwal это было. Большое спасибо. –
@Ajaybeniwal добавить это как ответ тогда :) – Chandermani