1

JavaScript プログラムで、ファイル内のデータからグローバル 3 プロパティ配列オブジェクトを埋めようとしています。プログラムがうまく動かなかったのでデバッグを試みたところ、Firefoxの内部デバッガーを使用して実行すると動作することがわかりました。そこでFirebugを使ってみたのですが、Firebugがフリーズしてしまいました。単純な「アラート」挿入に戻って、「アラート」を追加すると実行が成功したが、不可解な「アラート」メッセージが表示されることがわかりました-配列の長さは、配列作成サブルーチン内では問題ないように見えますが、ルーチンの外ではゼロです。おそらく私は何か間違ったことをしていますが、この動作に困惑しているので、ここで助けを求めています(初めてのユーザーとして)。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 index Loop」は0を返しますが、そのアラートが含まれている場合は予想される配列サイズを示します

4

2 に答える 2

1

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

これにより、スクリプトはスクリプトを「順番に」実行します。

于 2013-07-11T19:10:18.457 に答える
0

Ajax リクエストは非同期であるため、呼び出しの直後に結果を処理することはできません。alert は、実行後のすべてを一時停止し、この間に ajax が正常に終了し、 end が変数を埋めるという理由だけで、あなたを「助けます」。したがって、コールバックが成功しただけで、ノードデータでスタッフを実行する必要があります

于 2013-07-11T19:04:41.703 に答える