簡體   English   中英

添加警報后,JavaScript可以正常工作

[英]Javascript works when alert added

在一個javascript程序中,我試圖從文件中的數據填充全局3屬性數組對象。 該程序無法成功運行,因此我嘗試調試,但是發現在使用Firefox的內部調試器運行時它確實可以運行。 因此嘗試使用Firebug,但Firebug凍結了。 回到簡單的“ alert”插入,我發現添加“ alert”可以成功運行,但是令人困惑的“ alert”消息-數組創建子例程中的數組長度似乎可以,但是在例程之外為零。 大概我做錯了什么,但是mm對此行為感到困惑,因此請轉為尋求幫助(作為首次用戶)。 FWIW JQuery用於讀取數據。 以下是該程序的要點:

var nodedata = new Array();
nodedata = [];
// use routine to fill array
requestNodeData();
alert('POST requestNodeData nodedata.length=' + nodedata.length);
// create markers
for (var index in nodedata) addMarker(nodedata[index], index);
alert('POST index Loop nodedata.length=' + nodedata.length);
  ...

function requestNodeData() {
  var formData = $('#form').serialize();
  $.post('/cgi-bin/get_nodedata.cgi', formData, processNodeData, 'text').error(processNodeDataError);
  return false; // this prevents form button submission
}

function processNodeData(data) {
  var strings = new Array(3);
  datalines = data.split(/\n/);
  for (var i = 0; i < (datalines.length); i++) {
    strings = datalines[i].split(/,/);
    nodedata[i] = {
      'lat': strings[0],
      'lng': strings[1],
      'name': strings[2]
    };
  }
  alert('END OF requestNodeData nodedata.length=' + nodedata.length);
}

注意:“ END OF requestNodeData”警報始終提供預期的數組大小。添加“ POST requestNodeData”警報使程序成功運行! 但是數組大小為“ 0”,而不是預期的數組大小! 如果省略了“ POST requestNodeData”警報,則“ POST索引循環”將為0,但是當包含該警報時,它將提供預期的數組大小

您正在使用AJAX請求來檢索數據。 默認情況下,此請求是異步的。 發生的事情是您正在執行requestNodeData() 這將設置ajax請求並將其發送到服務器。 但是,該腳本將立即繼續運行,並處理從ajax請求返回的數據(與其余腳本異步)。

長話短說。 它將執行:

requestNodeData();
for (var index in nodedata) addMarker(nodedata[index], index);

... (some time goes by) ...

and when the data from requestNodeData is ready,
it'll execute processNodeData(data)

使用alert將暫停腳本(但顯然不會暫停ajax請求),這將“及時”填充您的變量。 因此,通常最好使用console.log來防止警報破壞您的應用程序流。


要解決此問題,請使用jQuery.ajax()方法而不是jQuery.post()並將'async'設置為false,如下所示:

$.ajax({
  type: "POST",
  url: '/cgi-bin/get_nodedata.cgi',
  data: formData,
  success: processNodeData,
  dataType: 'text',
  async: false
});

這將導致腳本“按順序”執行腳本。

Ajax請求是異步的,因此在調用之后,您無法處理它的結果。 警報“幫助”您,只是因為它會在執行后暫停所有操作,並且在此期間ajax成功結束,所以end會填充您的變量。 因此,您應該對節點數據進行任何處理,僅在成功回調時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM