如何在回调后使用该值

时间:2012-02-26 18:54:11

标签: javascript callback

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

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

3 个答案:

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

第三次编辑

如果我们谈论这个问题,我建议使用一个很好的技巧,它在PrototypeMooToolsjQuery中使用,根据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);
}