1

javascript内に(単一のオブジェクト内に)APIのシステムを作成したいのですが、そのすべてがjQueryのajax関数に由来しますが、次のようにトリガーされるオーバーライド「成功」関数を渡すことができるようにしたいです。

function Eidos(){

    this.api = function(data, success){
        $.ajax({
            type: 'POST', 
            url: '/api',
            data: data,
            success: function(rData){
                return rData;
            }
        })
    };

    this.refreshInfo = function(id, success){
            log.info('refreshed page id:  '+ id);
            return this.api({'command': 'refresh', 'pageid': id}, success);
    }


};

この例では、情報を「更新」したいだけです(新しいテキストデータまたは何を持っているかを取得します)。すでにサーバー側のページ設定があります。

そして、私はそれを次のように呼び出します:

$('.refresh').click(function(){
        $("#myModal").modal('show');
        var id = $(this).data('ei');
        var api = eidos.refreshInfo(id, function(){
                $("#myModal").modal('hide');
                });
        return false;
    });

明らかにこれは機能しません(ところで、オブジェクトはすでにvar eidos = new Eidos();を介して作成されています)が、Idkはそれを実装する方法を説明します。成功したいのですが、関数がページごとに異なる動作をするため、オーバーライドが必要になりますが、ここでそれを機能させる方法がわかりません。

4

5 に答える 5

4

変更してみる

success: function(rData){
   return rData;
}

success: success

success現在、引数を呼び出していません (使用していません) 。

于 2012-08-30T13:22:01.047 に答える
2
        success: function(rData){
            return rData;
        }

が問題です。コールバック関数のパラメーターが既にあるので、それを使用します。

        success: function(rData) {
            success(rData);
        }

または、短くするために、コールバック関数をパラメーターとして jQuery ajax に直接渡します。

于 2012-08-30T13:23:23.917 に答える
1

非同期呼び出しを行っており、同期のように動作しています。非同期呼び出しから戻って、呼び出された場所にデータが返されることを期待することはできません。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            return rData;  //<-- That return is not going to work
        }
    })
};

コールバックを渡したい場合は、それを割り当てます。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success
        }
    })
};

またはそれを呼び出す

this.api = function(data, success){
    var that = this;
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: function(rData){
            success(); //<-- call it or you can use apply/call
            //success.apply(that,arguments);
            return rData;  //<-- That return is not going to work
        }
    })
};
于 2012-08-30T13:22:43.870 に答える
1

successどこでもコールバックを使用していません。

this.api = function(data, success){
    $.ajax({
        type: 'POST', 
        url: '/api',
        data: data,
        success: success || function(rData) {
            // some default handler to use if none is passed
        }
    })
};

これsuccess: success || function(rData) {により、成功パラメーターをオプションにすることができます。何も渡されない場合は、指定したデフォルトのハンドラーが使用されます。

于 2012-08-30T13:32:22.517 に答える
0

これを考える方法は、JQuery ajax 関数が起動時に rData を関数に渡すことです。rData は、制御できない jQuery 内部の閉じたスコープ内のどこかに単純に返されるため、それを使用して何かを行う場所はその成功関数内にあります。

または、別のイベントで外部の何かに通知することもできます:

//...
    success:function(rData){
        $(someOtherObject).trigger({type:'rDataDelievered', successData:rData});
    }
}

someOtherObject.bind('rDataDelivered', function(e){ doSomething(e.successData); });

これは頻繁に使用される機能ではありませんが、はい、その場で新しいイベントを定義し、jQuery を使用して必要なときにトリガーすることができます。rData オブジェクトを渡していない場合はtrigger('rDataDelivered')、単純なシグナルで十分です。しかし、ここにはかなりの冗長性があります。何も止められない場合は、適切な場所で確立された ajax イベントを使用して、成功関数で実行することをお勧めします。

于 2012-08-30T13:34:59.430 に答える