在我的应用程序中,我在一个方法中隔离网络并执行回调以获取JSON响应,我怎样才能在之后使用它?
getJson(url, acallback);
function getJson(url, callback) {
Ti.API.info(" im here " + url);
var jsonObject;
var xhr = Ti.Network.createHTTPClient();
xhr.setTimeout(3000);
xhr.onload = function () {
var jsonObject = eval('(' + this.responseText + ')');
callback.call(jsonObject)
}
xhr.open("GET", url);
xhr.send();
Ti.API.info(" passed ");
};
function acallback() {
return this;
}
现在我的问题是,我怎样才能使用返回的输出?
答案 0 :(得分:2)
应该是这样的:
function getJson(url, callback) {
Ti.API.info(" im here " + url );
var jsonObject, xhr = Ti.Network.createHTTPClient();
xhr.setTimeout(3000);
xhr.onload = function() {
var jsonObject = JSON.parse(this.responseText);
callback(jsonObject)
}
xhr.open("GET" , url);
xhr.send();
Ti.API.info(" passed " );
}
function acallback(json) {
Ti.API.info("data from ajax: " + json);
}
getJson(url , acallback);
请注意,我删除了使用 eval ,因为使用它是不好的做法,正如它所说的那样(here):
eval功能非常快。但是,它可以编译和执行 任何JavaScript程序,都可能存在安全问题。指某东西的用途 当来源可信并且胜任时,将显示eval。它很多 更安全地使用JSON解析器。在XMLHttpRequest的Web应用程序中, 通信只允许提供相同的来源 页面,所以它是值得信赖的。但它可能没有能力。如果是服务器 它的JSON编码不严谨,或者它不严格 验证其所有输入,然后它可以提供无效的JSON文本 这可能是危险的脚本。 eval函数会 执行脚本,释放它的恶意。
此外,每个范围最好只使用 var 关键字一次。
如果要在回调范围之外使用生成的json对象,只需在需要json的范围内定义回调,例如:
var obj = {
x: 4,
doit: function() {
var _this = this;
var callback = function(json) {
alert(_this.x * json.y);
};
getJson(url , callback);
}
}
json.y 部分我当然是为了这个例子做的。
或者,如果您想使用调用选项,则可以执行以下操作:
function getJson(url, callback, bindto) {
Ti.API.info(" im here " + url );
var jsonObject, xhr = Ti.Network.createHTTPClient();
xhr.setTimeout(3000);
xhr.onload = function() {
var jsonObject = JSON.parse(this.responseText);
callback.call(bindto, jsonObject)
}
xhr.open("GET" , url);
xhr.send();
Ti.API.info(" passed " );
}
var obj = {
x: 5
}
function myCallback(json) {
alert(this.x * json.y);
}
getJson(url, myCallback, obj);
如果我们谈论这个问题,我建议使用一个很好的技巧,它在Prototype,MooTools,jQuery中使用,根据MDN Introduced in JavaScript 1.8.5
Function.prototype.bind = function(scope) {
var _function = this;
return function() {
return _function.apply(scope, arguments);
}
}
您可以阅读我从中复制代码的tutorial。
答案 1 :(得分:1)
需要使用输出的代码应放在acallback
中(或置于从acallback
调用的函数中。)
答案 2 :(得分:1)
我相信callback.call(jsonObject)
应该真正阅读callback(jsonObject)
。一旦调用了异步函数,获取其值的方法是通过回调。因此,您传递的函数callback
将获得结果。说,
function myCallback(value) {
console.log(value);
}