首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >棱角工厂的承诺不能正确解决

棱角工厂的承诺不能正确解决
EN

Stack Overflow用户
提问于 2013-08-08 07:26:33
回答 1查看 681关注 0票数 1

我正在开发一个角度应用程序(在CoffeeScript中),并且有一个小型的PHP后端(是的,我知道),它为缓存的版本(从文件中)或从数据库中的版本提供了一个承诺。

我为此写了一个工厂:

代码语言:javascript
复制
@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
    }

我可以得到的数据很简单,如:

代码语言:javascript
复制
apiPromise = apiModel.get()
apiPromise.then (data) ->
    $scope.updateData(data)
, (reason) ->
    console.log reason

到目前为止效果还不错。

然后,我想像这样实时刷新数据:

代码语言:javascript
复制
$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()的数据),但这就是承诺的意义所在,不是吗?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-08 09:49:27

问题来了,因为您一直将其作为全局对象来处理,它将只解决一次,因此为了避免这种情况,您应该在get函数中声明延迟,而不是在全局级别上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18120242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档