4

このような並べ替え:

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  return foo;
}

ただし、スクリプトは非同期であるため、"" が返されます。それは明らかに私が望んでいるものではありません。

それで、私はこれを試しました:

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  for (;;) {
    if (foo != "") {
      return foo;
      break;
    }
  }
}

そして、私はそれがうまくいくと思っていましたが、うまくいきませんでした。なぜだめですか?そして、誰かが解決策を提案できますか?

4

3 に答える 3

2

関数へのコールバック パスを使用して、データを処理できるようにする必要があります。

function getfoo(callback) {
  var foo = "";
  $.get("foofile.html", function (data) {
    callback(data);
    // do some other things
    // ...
  });
}

getfoo(function(data) {
   console.log(data);
});
于 2012-09-23T05:38:50.780 に答える
1

ajaxを使用する場合は、コードを少し異なる方法で記述する必要があります。発信者と着信者のロジックを分離する必要があります。

既存のコードが次のようなものだとします

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    foo = data;
  });
  return foo;
}

function usefoo(){
  var data = getfoo();
  // do something with data
}

それは本当に次のように書かれるべきです

function getfoo() {
  var foo = "";
  $.get("foofile.html", function (data) {
    usefoo(data);
  });
}

function usefoo(data){
  // do something with data
}
于 2012-09-23T05:47:41.707 に答える
1

ajax の最初の「a」は非同期を表すので、あなたがやろうとしていることは ajax の哲学に反するようなものです。ただし、ブロッキング リクエストを使用することは可能ですが、これは簡略化されたインターフェイスではサポートされていないため、関数.getを使用する必要があります。.ajax

var foo = "hmmm";
$.ajax("jquery.js", {async:false, success:function(x){foo=x}});
alert(foo);

JavaScript の基本的な実行モデルはイベントベースでシングル スレッドです (マルチスレッド機能を提供する Web ワーカーがありますが、各ワーカーは独自のアドレス空間に存在し、他のワーカーやメイン スレッドとメモリを共有することはできません...スレッドよりもプロセスに似ているという意味です)。

Javascript では、他のことが起こるのをループで「待つ」ことはできません。関数は常にすぐに終了し、何かが起こったときに再度呼び出されるようにコールバックをアタッチする必要があります。ループを作成すると、JavaScript エンジンはそのループでスタックし、他の処理を実行できなくなります (JavaScript から可視である場合)。例えば:

// Warning: WRONG example... this won't work!
var foo = 0;
setTimeout(function(){foo = 1}, 100); // Set foo=1 after 100ms
while (foo == 0) ; // Wait for that to happen
alert(foo);

メイン コード パスが終了するまで、ブラウザー エンジンは他の JavaScript コード (タイムアウト コールバック) を実行できないため、動作しません。

このイベントベースのアプローチは、プログラミングをかなり簡素化します (ロックが必要ないため... 状態を操作するスレッドは常に 1 つだけです) が、長時間の操作には別のフロー設計を使用する必要があります。

単一の実行スレッドがあるという事実は、JavaScript コードが長い計算を実行している間、他のすべてがブロックされ、ブラウザーがユーザーに対して応答していないように見えることも意味します。

この無応答性が、リソースを取得するための同期呼び出しの使用が悪い習慣と見なされる理由です...複数のストリームから異なるリソースを同時に取得するという困難な仕事は、ブラウザーによって既に実装されていますが、JavaScript コードはコールバック モデルを使用する必要があります。この機能を利用することができます。

于 2012-09-23T05:44:29.373 に答える