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(){
                toggle_visibility('bump_img'+post_id);
            });
        } else {
            alert(data);
        }
    });
}

現在、これは実行され、php/like_add.phpエコーsuccessは正しく行われます。問題は、メインの投稿機能には post_id を渡すことですが、.done(function(); post_id は渡されません。そのため、idtoggle_visibilityは「like_post_x」ではなく「like_post_」になっています。直前に実行されている関数から .done 関数に変数を渡すにはどうすればよいですか?

試しbump_get(photo_id).done({photo_id:photo_id}, function(){ましたが、これはうまくいきませんでした。

何か案は?

4

2 に答える 2

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

これは ajax コールバックを単純な呼び出しに置き換えますが、setTimeout()コンセプトは同じです。将来のある時点で実行されるコールバック関数を定義し、コールバックが実際に実行されるずっと前に返される親関数の変数を使用します。実行します。

于 2013-07-27T20:40:15.837 に答える
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);
        }
    });
}
于 2013-07-27T20:38:59.137 に答える