【问题标题】:RequireJS module receives JSON from API server, returns undefined?RequireJS 模块从 API 服务器接收 JSON,返回未定义?
【发布时间】:2015-08-01 10:13:40
【问题描述】:

我已经阅读了各种关于 Promise 和模块创建的内容,但我不明白为什么这不起作用。

我正在编写一个脚本,该脚本接受用户名,然后使用单独的模块从第 3 方 API 获取用户数据。将其放入同一个脚本时,我可以使一切正常工作,但是当我将 API 请求拉出并将其分离到自己的模块中时,我做错了。这些都是以 durandal 为框架构建的。

脚本:

define(function(require) {
var http = require('plugins/http'),
    ko = require('knockout'),
    apiPullMod = require('apiPullMod');

return {
    name: ko.observable('RyeBrush'),
    nameInfo: ko.observableArray([]),
    getSummoner: function() {
        var that = this;
        if (!that.nameInfo()) {
            return;
        } else {
            that.nameInfo.push(apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na'))
        };
        console.log(that.nameInfo);
    }
};
});

模块:

define(['plugins/http'], function(http) {
return {
    apiCaller: function(apiType, apiUserId, region) {
        http.get('https://' + region + '.api.pvp.net/api/lol/' + region + '/' + apiType + '/' + apiUserId + '?api_key=282d6dcb-a047-4262-88d0-c53b0e28e6ef', 'jsoncallback').then(function(response) {
            console.log(response);
            return response;
        })
    }
}
});

我可以从控制台看到 API 请求成功,我得到了预期的 JSON 对象,一切似乎都工作正常。但是,当我将它推送到 nameInfo 数组时,我得到的是:c(),在 firebug 中将鼠标悬停在它上面会给我提供我的淘汰赛库的文件路径。

当我尝试这个时:

 apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na').then(function(response){
                that.nameInfo.push(response);
                console.log(response);
            })

模块不会加载,我想是因为我没有将then 属性写入模块本身。但是,当我在这种情况下阅读 durandal 和 requirejs 的文档时,它显示我不需要?

如果我不得不归结为它,我的问题是:如何格式化我的模块和调用它的脚本,以将 JSON 对象从一个传递到另一个?

注意:我在这个问题中包含了我的个人 API 密钥,因为我可以按需重置它。在我的应用开发初期,我并不担心我的 API 流量。

【问题讨论】:

    标签: javascript json knockout.js requirejs durandal


    【解决方案1】:

    如果您更改 apiCaller 以返回一个承诺,它可能会起作用,就像这样

    define(['plugins/http'], function(http) {
        return {
            apiCaller: function(apiType, apiUserId, region) {
                return http.get('https://' + region + '.api.pvp.net/api/lol/' + region + '/' + apiType + '/' + apiUserId + '?api_key=282d6dcb-a047-4262-88d0-c53b0e28e6ef', 'jsoncallback');
            }
        };
    });
    
    apiPullMod.apiCaller('v1.4/summoner/by-name', that.name(), 'na').then(function(response){
        that.nameInfo.push(response);
        console.log(response);
    });
    

    【讨论】:

    • 等我回家试试。我也可能会尝试添加一个更强大的 Promise 库,而不是仅仅依赖 durandal 并要求使其全部工作。
    • 这成功了!谢谢!但为什么它起作用了?为什么不能通过.then 设置中的返回传递响应?我希望为其添加更多功能,但它现在可以使用。
    • 我认为我无法在评论中解释承诺的工作原理。这里有一个很好的答案,可能会对您有所帮助,stackoverflow.com/q/5316697/975720
    【解决方案2】:

    看起来 http 插件正在使用 knockout 的 map 插件来自动将您的响应转换为 observables。我推荐使用 jquery 的 http 插件或其他。

    【讨论】:

    • 这很奇怪。可能是你的权利,可能会解释c ()value。今晚将转换为直接使用 jquery。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2021-12-15
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多