Jquery $ .ajax获取与嵌套传递'this'对象到'success'回调函数冲突的响应

时间:2012-05-28 21:22:25

标签: javascript jquery callback

我正在尝试在类的方法中执行jquery $.ajax Get。由成功回调函数中使用的Get请求提供的数据以及类需要在同一回调中修改。所以,我必须.apply对原始类的 this 标识符进行回调,否则,在回调中, this 在当地被取代。但是,在将回调应用于 this 时,Get返回的数据将显示为undefined。我该如何解决这个问题。任何帮助表示赞赏。

var tableblock = function(tablename){
     this.tablename = tablename;
     this.numusers = 0;
     this.userpool = new Array();

     this.addme = function(){
        bodyContent = $.ajax({
            type: "GET",
            url: "controllers/bestpals.php",
            data: "addpal=1&palname="+userid+"&nocache="+Math.floor((Math.random()*100)+1),
            error: function(xhr, statusText){alert('could not add pal. refresh page.');},
            success: function(msg){
                alert(msg); // this will give undefined when .apply(this) 
                myid = msg;
                syncpals(this,true);
            }.apply(this) // using this alert(msg) above gives undefined 
        });
     };
 }

3 个答案:

答案 0 :(得分:5)

您可以在ajax配置中提供context参数;将在该上下文中调用所有ajax回调(即,回调中的this将引用您在context调用中作为$.ajax()传递的值:

SomeClass.prototype.methodName = function() {
    $.ajax({
        ....
        context: this    // callbacks will be called with the same context that methodName() is running in
        ....
    });
}

答案 1 :(得分:1)

您需要.bind(this),而不是.apply(this)bind更改函数的this指针,而apply实际上在新上下文中运行函数。

答案 2 :(得分:1)

我认为你的意思是bind而不是applybind创建一个新函数,在设置this的同时调用包装的函数;只要apply运行,addme()就会立即调用该函数。

bind是ECMAScript第五版的功能,因此您需要执行以下操作之一:

  1. polyfill bind适用于较旧的浏览器;
  2. 使用jQuery等效proxy;
  3. 使用context参数ajax,明确设置this;
  4. 请记住var that= this;中的addme,并在内部函数中使用随附的that引用。