运行ajax函数的多个实例 - 只有第二个实例更新

时间:2012-05-29 22:18:17

标签: javascript ajax prototypejs

我无法调用同一个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");
        }       
    });
}

如果我用两个不同的id号称这个函数两次,即:

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

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

javascript是否会混淆2​​个实例?

2 个答案:

答案 0 :(得分: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变量,或者
  • 使用synchrone模式,因此sms1返回在调用sms2之前返回。

答案 1 :(得分: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");
        }       
    });
}