js回调函数

时间:2011-01-21 10:26:15

标签: javascript

如何回调对象中的函数?

json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1', 'rtn_tracks');

我没有回调rtn_tracks()而是想对this.rtn()进行回调

如何在回调字符串中定义它?

以下是代码:

function stream_tracks(){
 this.get = function(id){
  json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1', 'rtn_tracks');
 };

 this.rtn = function(json_obj){
  this.cnstr(json_obj);
 };

 this.cnstr = function(json_obj){
  alert('test');
 };
}
Stream_tracks = new stream_tracks();

var XMLHTTP = {};
function json_post(request_uid, uri, get_str, callback_function, callback_var){
 request_uid += Math.floor(Math.random()*999999).toString();

 if(window.XMLHttpRequest){
  XMLHTTP[request_uid] = new XMLHttpRequest();
 }
 else if(window.ActiveXObject){
  XMLHTTP[request_uid] = new ActiveXObject('Microsoft.XMLHTTP');
 }

 XMLHTTP[request_uid].open('POST', uri, true);
 XMLHTTP[request_uid].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 XMLHTTP[request_uid].onreadystatechange = function(){
  if(XMLHTTP[request_uid].readyState == 4){
   if(callback_function){
    eval(callback_function+'('+XMLHTTP[request_uid].responseText+(callback_var ? ', callback_var':'')+')');
   }
  }
 }
 XMLHTTP[request_uid].send(get_str);
}

3 个答案:

答案 0 :(得分:1)

不使用字符串进行回调,而是使用方法。

var my = {
    start : function (s, callback) {
        callback(s);
    },
    callback: function(s) {
    }
}

你不能使用:

my.start("Hello World", my.callback)

因为这会导致处理方法而不连接到对象my,但你可以这样做。

my.start("Hello World", function(s) { my.callback(s); });

答案 1 :(得分:0)

好的,你需要做几件事,如果你读过closures,可能会更有意义。

首先,您需要引用this变量,以便在回调中访问它而不会覆盖它。

function stream_tracks(){
   var obj = this;

然后,如果您想从其他方法中引用该类/对象的属性,只需使用obj.this

您应该做的第二件事是将回调作为函数传递而不是字符串。它也会更有效率,因为你可以取消eval功能。

 this.get = function(id){
  json_post(
       'get_tracks',
       'json.request.php?get=tracks',
       'genreId='+id+'&perPage=70&page=1',
       function(){ obj.rtn(); }
     );
 };

在匿名函数中包装回调形成了闭包,并允许函数使用类中的变量。此外,如果您这样做,您可以在函数的同时传递任何参数,并取消父函数中的额外参数。

答案 2 :(得分:0)

您可以在Javascript中将函数作为对象传递,您不需要传递函数名称并使用eval。如果您的回调应该作为类的成员调用,您还需要传递类实例。例如。在json函数中添加一个回调上下文参数:

function json_post(request_uid, uri, get_str, callback_function, callback_var, callback_context){
    /*... snip ...*/
    XMLHTTP[request_uid].onreadystatechange = function(){
        if(XMLHTTP[request_uid].readyState == 4)
        {
            if(callback_function){
                /* The call() function lets you call a function in a context */
                callback_function.call(
                    callback_context || this,
                    XMLHTTP[request_uid].responseText, 
                    callback_var
                );
            }
        }
    };
    XMLHTTP[request_uid].send(get_str);
}

然后你会这样称呼它:

json_post('get_tracks', 'json.request.php?get=tracks', 'genreId='+id+'&perPage=70&page=1', 
    this.rtn, // callback function
    null, // callback var
    this // callback context
);

这是一个很好的提示:使用框架!它会让你的一天变得更轻松。