1

同じAjax.Request関数の複数のインスタンスを呼び出すのに問題があります。(私はPrototypeフレームワークを使用しています)。関数は次のとおりです。

function send_SMS(id)
{
    status_id = 'status_link_' + id;

    new Ajax.Request('sendSMS.php', 
    {
        method:'post',
        parameters: {link_id: id},
        onCreate: function(){
            $(status_id).update("sending...");
        }, 
        onSuccess: function(transport){
            if (transport.responseJSON.success) {
                $(status_id).update("sent");
            } else {
                $(status_id).update("unable to send");
            }
        },
        onFailure: function(){ 
            $(status_id).update("unable to send");
        }       
    });
}

この関数を2つの異なるID番号で2回呼び出すと、次のようになります。

send_SMS("1");
send_SMS("2");

2番目のIDのみがonSuccess関数によって更新されます。sendSMS.phpファイルは2回正常に実行されます(名前が示すように、SMSメッセージを送信し、実際に2つのメッセージが正常に送信されます)が、onSuccess関数は2回目しか呼び出されないようです。

javascriptは2つのインスタンスを混乱させていますか?

4

2 に答える 2

1

これは、status_idがグローバル変数であるため、参照が呼び出されているコールバック内の両方の呼び出しのコンテキストに入るためだと思います。

onSuccess: function(transport){
        if (transport.responseJSON.success) {
            $(status_id).update("sent");
        } else {
            $(status_id).update("unable to send");
        }
    }

重要なのは、onSuccessコールバックは、呼び出されたときに、その時点でのコンテキストとともにコンパイルされるということです。そして、その時点で、status_idは "status_link_2"と等しくなります。これは、最初のsms_send呼び出しが戻る前に、への呼び出しが行われる可能性が高いためです。send_SMS("2");

解決策は次のとおりです。

  • ajax呼び出し内でIDを送信し、応答でIDを取得して、status_id変数を作成するか、または
  • 同期モードを使用して、sms2の呼び出しの前にsms1リターンが返されるようにします。
于 2012-05-29T23:02:33.260 に答える
0

これは仕事関数です:

function send_SMS(id)
{
    new Ajax.Request('sendSMS.php', 
    {
        method:'post',
        parameters: {link_id: id},
        onCreate: function(){
            $('status_link_' + id).update("sending...");
        }, 
        onSuccess: function(transport){
            if (transport.responseJSON.success) {
                $('status_link_' + id).update("sent");
            } else {
                $('status_link_' + id).update("unable to send");
            }
        },
        onFailure: function(){ 
            $('status_link_' + id).update("unable to send");
        }       
    });
}
于 2012-05-30T00:10:27.967 に答える