初始化api后调用的Angular $资源,导致返回值为空

时间:2013-05-05 09:12:17

标签: javascript rest user-interface angularjs

我正在尝试构建一个基本的RPG,就像简单的网页游戏一样。我有一个java服务器,它为纯html5应用程序提供了一个rest api。

此应用程序具有按类别返回任务的服务。它还允许用户查看有关任务的详细信息。任务是通过休息api给出的。我正在使用$ resource依赖来阅读这个api。

问题是,我有一个定义如下的服务:

(function( ng, app ) {

    "use strict";

    // I provide a repository for the quests.
    app.service(
    "questService",
    function( $q, $resource, $http, _, categoryService ) {

        var QuestbookAPI = $resource( 'http://174.126.249.6\\:8080/worldcraft/quests' , {}, { query: {method: 'GET', isArray: true} });

        var quests = [];

        QuestbookAPI.query(function(newQuests){
            console.log("I ran !!!!! WOOTZORS . I am the questbook api query.");
            quests = newQuests;
            _.each(quests, function(quest){
                quest.id = quest.questID.id;
                quest.categoryID = quest.questCategory.id;                  
            });
        });

        // ***** general questbook api
        function getQuestByID( id ){}
        function getQuestsByCategory( categoryId ){}
        ....
        // ***** end general questbook api
        // I get the quest with the given ID.

        // Return the public API.
        return({
            getQuestByID: getQuestByID,
            getQuestsByCategoryID: getQuestsByCategoryID,
            getRandomQuestExcluding: getRandomQuestExcluding,
        });


    }
    );

})( angular, Worldcraft );

由于某种原因,当使用此服务的控制器调用getQuestsByCategoryID时,资源查询不会运行。

如果我离开页面并重新访问它,查询将运行,并且填充任务数组的方式。

我的问题是,为什么我的查询在其他任何事情之前都没有运行?我觉得我错过了一个非常基本的概念。

该项目的git位于

的github上

https://github.com/ClinkWorks/Worldcraft-UI

正在运行的项目位于

http://www.clinkworks.com/worldcraft-ui

如果你点击任务,然后进行战斗,返回一个关卡,然后再次打击你可以看到我的意思。

出于某种原因,getQuestsByCategoryID函数在QuestbookAPI.query()之前运行,即使在声明服务时运行了查询...我很困惑..

我知道它与promises ...或$ q对象有关,但我不太确定如何。

1 个答案:

答案 0 :(得分:1)

$resource.query个调用都是异步填充的。在所有其他代码运行之前,无法保证调用将会执行。

您的来电者应该是在query&内部进行回调的人。将其设置为$scope变量。然后,您可以使用$watch来检查作业&在数据到达后做一些事情。