Angularjs 角形工厂承诺赢得';无法正确解析

Angularjs 角形工厂承诺赢得';无法正确解析,angularjs,coffeescript,promise,Angularjs,Coffeescript,Promise,我正在开发一个Angular应用程序(在CoffeeScript中),并且有一个小型PHP后端(是的,我知道),它可以提供缓存版本(来自文件)或来自数据库的版本 我已经为此编写了一个工厂: @myApp.factory 'apiModel', ($http, $q) -> deferred = $q.defer() apiData = null getData = (fromDb) -> fromDb = (fromDb == true)

我正在开发一个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中。然后在
getData()
中的数据之前记录
),但这就是promise的作用,不是吗

提前谢谢


问题来了,因为你保持着全球差异 对象它将只解析一次,因此为了避免此问题,您应该 在get函数中声明DEREFERED不在全局级别


问题来了,因为您将deffered保留为全局对象,它将只解决一次,因此为了避免这种情况,您应该在get函数中声明deferred,而不是globallevel@Ajaybeniwal就这样。非常感谢。@Ajaybeniwal将其添加为答案:)