2013-07-27 156 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回調,但它是相同的概念 - 我們正在定義一個回調函數,它將在未來的某個時間點運行,並使用父函數中的一個變量,這個變量在回調實際運行之前很久就會返回。