1

我很难调用同一个 Ajax.Request 函数的多个实例。(我正在使用原型框架)。这是功能:

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 号调用此函数两次,即:

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

onSuccess 函数仅更新第二个 ID。sendSMS.php 文件成功运行了两次(顾名思义,它发送一条短信,确实成功发送了 2 条短信),但似乎只调用了第二次 onSuccess 函数。

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”,因为您的呼叫最有可能send_SMS("2");在第一个 sms_send 呼叫返回之前出现。

一个解决方案是:

  • 在 ajax 调用中发送 id,并在响应中检索它以构建您的 status_id 变量,或者
  • 使用同步模式,因此 sms1 返回在 sms2 调用之前返回。
于 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 回答