1

テキストファイルからデータを取得し、別の関数で警告するために使用する関数があります。

  var library_name; // Global Variable

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
         });
  }

 function saveFeedback() {
    alert(library_name);
  }

saveFeedback が呼び出されると、library_name にアラートが送信されます

このように同じ関数に入れようとしました

function saveFeedback() {
    jQuery.get('stream.txt', function(data) {
         library_name = data.toString().substring(17,data.length);
    });

    alert(library_name);
}

しかし、コンソールではまだ未定義と言い続けています

これを解決する方法は?saveFeedback 関数を別の場所から呼び出す必要があるため、パラメーターを使用しません。

4

6 に答える 6

0

jQuerygetは非同期呼び出しを開始します。非同期とは、結果が後で返されることを意味します...おそらく少し後に、おそらく数秒後に。この呼び出しを開始した後、コードはすぐにアラートである次の行に進みます。このアラートは非同期呼び出しから戻るundefinedに発生するため、もちろん変数はまだ設定されていません。

この問題を解決する1つの方法は、jQueryに呼び出しを同期させるように指示することです。ただし、これは間違った答えです。これは、呼び出しが行われている間、ブラウザがユーザーの操作に応答しなくなるためです。代わりに、非同期呼び出しについての考え方を調整する必要があります。基本的な概念は、通常の手順レシピのように段階的に処理する大きな関数(ステップ1、ステップ2、ステップ3の順に実行)を使用する代わりに、2つの異なるレシピまたはコードを設定する必要があるということです。 :1つはajax呼び出しを開始してから終了し、もう1つはajax呼び出しの結果に応答します。

これで、すでに2つの機能があります。すでに説明した理由により、それらを組み合わせることはできません。ただし、それらをチェーンしたり、一方を他方の中にカプセル化したりすることができます。

var library_name;

function saveFeedback() {
   alert(library_name);
}

function getLibraryName(){
   jQuery.get('stream.txt', function(data) {
      library_name = data.toString().substring(17 ,data.length);
      saveFeedback(); // this chains the two functions together
   });
}

または多分さらに良い:

var library_name;

function saveFeedback() {
   alert(library_name);
}

function receiveLibraryName(data) {
   library_name = data.toString().substring(17, data.length);
   saveFeedback();
   // additional statements here after saving
}

function getLibraryName(){
   jQuery.get('stream.txt', receiveLibraryName);
}

重要なのは、関数内で通常どおり次のステートメントを続行できないことです。getLibraryNameajax呼び出しの後に実行する手順は、別の関数内にある必要があります。つまり、コールバック関数自体、またはコールバック関数から呼び出された別の関数のいずれかです。

于 2012-12-10T08:41:12.853 に答える
0

$ .data();を使用して、非表示の入力フィールドを作成し、それにデータを添付できます。

例えば:

  function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           var library_name = data.toString().substring(17,data.length);
           $('#myHiddenField').data('library_name', library_name);
         });
  }

 function saveFeedback() {
    alert($('#myHiddenField').data('library_name'));
  }
于 2012-12-10T08:36:53.810 に答える
0

get が終了すると、の 2 番目のパラメータ.getが呼び出されます。stream.txt「フェッチして、終了したら、この関数を実行する」と言っています。以下は、get が終了したときに saveFeedback を呼び出します。

function getLibraryName(){
         jQuery.get('stream.txt', function(data) {
           library_name = data.toString().substring(17,data.length);
           saveFeedback();
         });
  }

get は非同期であるため、インタープリターは関数が呼び出されるsaveFeedback前に関数をインスタンス化しますsuccess(ただし、JSLint などの一部のサニティ チェッカーでは、おそらく.saveFeedbackgetLibraryName

于 2012-12-10T08:28:27.677 に答える
0

You shoud use saveFeedback() function in $.get(data) callback, because it it async request and you do not know, when it will be completed.

于 2012-12-10T08:32:14.820 に答える
-2

jquery.get の前に一度 library_name を定義する必要があります。jquery.getが機能しない場合、アラートを呼び出すまでにlibrary_nameが作成されないためです。var library_name; を追加してください。saveFeedback() の最初の行として。

于 2012-12-10T08:28:20.963 に答える