【问题标题】:Angular factory promise won't resolve correctlyAngular 工厂承诺无法正确解决
【发布时间】:2013-08-09 19:47:22
【问题描述】:

我正在开发一个 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() 中记录响应时,它会显示正确的刷新数据,但是当我从promise($scope.refreshData())中记录数据时,它会显示旧数据。

我认为这是异步请求的问题(它在来自getData() 的数据之前将数据记录在promise.then)但这就是承诺的用途,不是吗?

提前致谢

【问题讨论】:

  • 问题来了,因为您将延迟作为全局对象,它只会被解决一次,因此为避免这种情况,您应该在 get 函数中声明 deferred 而不是在全局级别
  • @Ajaybeniwal 就是这样。非常感谢。
  • @Ajaybeniwal 然后将其添加为答案 :)

标签: angularjs coffeescript promise


【解决方案1】:

问题来了,因为你一直保持为全局延迟 object 它只会被解决一次,所以为了避免这种情况,你应该 在 get 函数中声明 deferred 不在全局级别

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多