2013-07-27 118 views
1

好了,我有以下功能:传递变量通过对.done(函数()

function add_like(post_id) { 
    $.post('php/like_add.php', {post_id:post_id}, function(data){ 
     if (data == 'success') { 
      bump_get(photo_id).done(function(){ 
       toggle_visibility('bump_img'+post_id); 
      }); 
     } else { 
      alert(data); 
     } 
    }); 
} 

目前这个运行,php/like_add.php回声的success正确的问题是,主哨的功能我。将post_id传递给它,但是对于.done(function(); post_id没有传递给它,因此toggle_visibility的id变成'like_post_'而不是'like_post_x'。我如何将函数中的变量传递给.done函数就在它之前?

我试过bump_get(photo_id).done({photo_id:photo_id}, function(){,但是这个没有工作。

任何想法?

+0

就目前而言,传递给'toggle_visibility'的'post_id'将完全**发送给'like_add.php'的相同值。您需要在http://jsfiddle.net上提供http://sscce.org/以正确显示您的问题。 – Matt

+0

您的描述与您的代码不符。没有任何地方可以回应或警告'成功',并且没有任何东西像'like_post'这样引用。 – jcsanyi

+0

@jcsanyi我解释了在我的问题中产生'成功'的原因......? – Simo389

回答

1

可以包括具有立即打电话匿名函数变量:

function add_like(post_id) { 
    $.post('php/like_add.php', {post_id:post_id}, function(data){ 
     if (data == 'success') { 
      bump_get(photo_id).done((function(post_id){ 
       return function(){ 
        toggle_visibility('bump_img'+post_id); 
       }; 
      })(post_id)); 
     } else { 
      alert(data); 
     } 
    }); 
} 
1

因为在JavaScript的工作方式变量的作用域和封闭的,正确的post_id值已经在你的回调函数可用。

当你调用add_like(),一个新的作用域被创建,并在该范围内创建post_id变量,因为它是函数的参数。该范围内的变量在整个函数的执行过程中都可用,以及函数结束后创建的任何匿名函数(闭包) - 例如回调函数。

作为证据的概念,请参见下面的简化代码,你可以在一个小提琴跑这里来了:http://jsfiddle.net/R4HNx/

function add_like(post_id) { 
    setTimeout(function() { 
     alert(post_id); 
    }, 2000); 
} 
add_like(10); 

这取代了简单setTimeout()调用Ajax回调,但它是相同的概念 - 我们正在定义一个回调函数,它将在未来的某个时间点运行,并使用父函数中的一个变量,这个变量在回调实际运行之前很久就会返回。