2011-01-21 106 views
1

我怎麼能回調到對象的功能?JS回調函數

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); 
} 
+0

請格式化你的代碼。 – polarblau 2011-01-21 10:27:33

+0

請選擇您的代碼片斷,然後點擊「代碼示例」(CTRL + K)按鈕;) – stecb 2011-01-21 10:27:56

回答

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

這裏有一個很好的提示,但:使用框架!它會讓你的一天更容易。

1

而不是使用回調字符串,使用的方法。

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

不能使用:

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

因爲這會導致不連接的對象要處理的方法我的,但你可以做到這一點。

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

好了,所以有一對夫婦,你需要做的事情,如果你有一個瞭解closures它可能會更有意義。

首先你需要做的this變量的引用,所以你可以在你的回調中訪問它沒有overwritting它。

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

結束語在匿名函數的回調形成閉合,並允許使用變量從類的功能。同樣,如果你這樣做,你可以通過與函數同時傳遞任何參數,並取消父函數中的額外參數。