2012-05-29 36 views
1

我很難調用同一個Ajax.Request函數的多個實例。 (我正在使用Prototype框架)。下面是函數:運行ajax函數的多個實例 - 只有第二個實例更新

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

只有第二ID由的onSuccess功能更新。 sendSMS.php文件成功運行兩次(顧名思義,它發送了一條SMS消息,事實上這兩條消息已成功發送),但onSuccess函數似乎只是第二次調用。

JavaScript混淆了2個實例嗎?

+0

「但的onSuccess功能似乎只能被稱爲第二次」 - 把'警報(123);'那裏,指望它是多少次所謂的 – zerkms

+0

我的整個生活,直到現在才發現「second」這個詞可以具有兩個含義 – ajax333221

回答

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回報纔回來短信的呼叫。
+0

感謝您的迴應 - 問題與您在我的變量範圍中提到的完全相同。謝謝您的幫助! –

+0

@AndyB使用閉包會容易得多,所以除了上面發佈的代碼片段之外,您不必更改任何內容。永遠不要做任何事情,除非這是唯一的選擇(它永遠不會相信我) – zatatatata

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