2

これが私の問題です。ホームページが表示されたら、LoadUser 関数を呼び出します。これが成功するglobalUserと、返された JSON で変数が設定されます。ロードした後、アラート関数を呼び出しますが、globalUser未定義と表示されます。他の多くの回避策を試しましたが、常に未定義のメッセージが表示されます。

alert(globalUser);成功関数でを呼び出すと、期待どおりに機能し、オブジェクトに警告します。

$('#Home').live('pageshow', function(event) {
  $.when(LoadUser()).done(function(a1) {
    alert(globalUser);
  });
});

function LoadUser() {
  $.ajax({
    // connects with the web service and validate de user input
    url: "http://localhost:51396/Icademy.asmx/GetUser",
    contentType: "application/json; charset=utf-8",
    data: { "userName": "'rodrigo'" },
    dataType: "jsonp",
    success: function(json) {
      globalUser = JSON.parse(json.d);
      return globalUser;
    },
    error: function(ret) {
      alert("Um erro ocorreu, tente novamente mais tarde.");
    }
  });
}
4

2 に答える 2

1

あなたの場合は気にする必要はありません。イベント$.whenに実装$.ajaxするだけですpageshow

$('#Home').live('pageshow', function(event) {
  $.ajax({
    // connects with the web service and validate de user input
    url: "http://localhost:51396/Icademy.asmx/GetUser",
    contentType: "application/json; charset=utf-8",
    data: { "userName": "'rodrigo'" },
    dataType: "jsonp",
    success: function(json) {
      globalUser = JSON.parse(json.d);

      alert(globalUser)
    },
    error: function(ret) {
      alert("Um erro ocorreu, tente novamente mais tarde.");
    }
  });
});
于 2012-12-16T08:38:47.617 に答える
1

成功関数内ですべてを実行しない理由がわかりません。あなたが自分で言うように、それはうまくいきます。さらに、成功時にコードを実行できるという利点があります。あなたの例では、ajax呼び出しに問題があった場合、「エラーが発生しました」というアラートが表示されますが、 when() コードは成功したと見なされます。

そうは言っても...

あなたは明らかに ajax の非同期性を理解していますが、.when().done() で間違って解決しています。LoadUser() はすぐに戻り、遅延ではなく null を返します。そのため、.done() はおそらくすぐに起動します。

解決策は、例のように .when(LoadUser()) を .when($.ajax()) に置き換えるか、LoadUser() から $.ajax (つまり、遅延オブジェクト) の結果を返すことです。

于 2012-12-16T10:00:48.297 に答える