RequireJS 模块从 API 服务器接收 JSON,returns 未定义?
RequireJS module receives JSON from API server, returns undefined?
我已经阅读了各种关于 promises 和模块创建的文章,但我不明白为什么这行不通。
我正在编写一个脚本,该脚本接受用户名,然后使用单独的模块从第三方获取用户数据 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 请求成功,我得到了 expecetd JSON 对象,一切似乎都工作正常。然而,当我将它推送到 nameInfo 数组时,我得到的是:c()
,将鼠标悬停在 firebug 中的这个上,会给我我的 knockout 库的文件路径。
当我尝试这个时:
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 流量。
如果您将 apiCaller 更改为 return 它可能会起作用的承诺,就像这样
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);
});
看起来 http 插件正在使用 knockout 的地图插件自动将您的响应转换为可观察值。我建议使用 jquery 的 http 插件或其他。
我已经阅读了各种关于 promises 和模块创建的文章,但我不明白为什么这行不通。
我正在编写一个脚本,该脚本接受用户名,然后使用单独的模块从第三方获取用户数据 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 请求成功,我得到了 expecetd JSON 对象,一切似乎都工作正常。然而,当我将它推送到 nameInfo 数组时,我得到的是:c()
,将鼠标悬停在 firebug 中的这个上,会给我我的 knockout 库的文件路径。
当我尝试这个时:
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 流量。
如果您将 apiCaller 更改为 return 它可能会起作用的承诺,就像这样
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);
});
看起来 http 插件正在使用 knockout 的地图插件自动将您的响应转换为可观察值。我建议使用 jquery 的 http 插件或其他。