2012-02-26 32 views
0

在我的应用程序中,我正在隔离方法中的网络并执行回调来获取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; 
} 

现在我的问题是,我怎么才能使用返回的输出呢?

回答

1

应该是这样的:

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); 

第三届编辑

如果我们”关于这个问题,我推荐使用一个很好的技巧,它在中使用210,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我从哪里复制到的代码。

+0

我不需要登录的价值,我需要使用它实际和超出范围的回调() – 2012-02-26 19:05:04

+1

我编辑了我的原始答案与如何可以完成。 – 2012-02-26 19:09:54

+0

*“你最好每个范围只使用一次var关键字。”*为什么? – 2012-02-26 19:12:40

1

需要使用输出的代码应放置在acallback(或放置在从acallback调用的函数中)

1

我相信callback.call(jsonObject)实际上应该是callback(jsonObject)。一旦你调用了一个异步函数,获取它的值的方法就是通过回调。所以,您传递的函数callback将会得到结果。再说了,

function myCallback(value) { 
    console.log(value); 
} 
+0

我不需要记录值,我需要实际使用它。 – 2012-02-26 19:01:43

+0

这是一个解释语法的例子。你可以用接收'jsonObject'的'value'参数来做任何事情。 – 2012-02-26 19:03:26

+0

如果我想使用超出acallback()范围的值,那实际上是我的问题 – 2012-02-26 19:04:28

相关问题