将变量传递给.done(function()

时间:2013-07-27 20:28:49

标签: php javascript ajax function post

好的,我有以下功能:

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 echo 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(){,但这不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分: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回调,但它是相同的概念 - 我们定义了一个将在未来的某个时刻运行的回调函数,并使用来自父函数的变量在回调实际运行之前很久就会返回。

答案 1 :(得分:0)

您可以使用立即调用的匿名函数包含变量:

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