3

重複の可能性:
それ以外で ajax respone を使用することは可能ですか?

WCF oData サービスにアクセスしてデータを取得する次の JavaScript ルーチンを作成しました。success 要素では、結果変数に結果を取得し、それらに警告します。返されたオブジェクトがあることがわかります。ajax 呼び出しの外で、結果を返す前に 2 番目のアラートを実行すると、結果変数は「未定義」になります。

誰が私が間違っているのか教えてもらえますか?

function retrieveJsonpODataSet(baseUrl, query)
{
  var oDataUrl = baseUrl + "?$format=json&$callback=?";
  var results;

  $.ajax(
  {
    url: oDataUrl,
    contentType: 'application/json; charset=utf-8',
    type: 'GET',
    dataType: 'jsonp',
    async: false,
    success: 
      function (data, textStatus, xhr) 
      {
          results = data.d;
          alert(results);  // This shows the results
      },
    error: 
      function (xhr, textStatus, errorThrown) 
      { 
          alert("Query failed.\n\n" + oDataUrl + "\n\n" + errorThrown);
          results = null;
      }
  });
  alert(results);  // This shows "undefined"
  return results;
}

クエリ パラメータは無視してください。ルーチンはまだ完了していません。

編集

最初はasync:false、ajax 呼び出しにはありませんでした。今追加しましたが、問題は解決しません。

4

4 に答える 4

6

ajax呼び出しは非同期操作です。それが起動し、コードはそれだけでは停止しません。Soresultsが返され、その時点では未定義です。あなたがする必要があるのは、コールバックを関数に渡すことです。

function retrieveJsonpODataSet(baseUrl, query, callback) {
   /* some code */
   $.ajax({
       /* some settings */
       success: function(res) {
           /* some code */
           callback(results);
       }
   });
}

今、あなたはそれをこのように使います

retrieveJsonpODataSet(baseUrl, query, function(res) {
    /* Hurray, I have result now in res variable! */
});

async: falseオプションを使用しないでください。通話が終了するまですべてのスクリプトをブロックします...そして、まったく終了しない場合はどうなりますか?? あなたは永久にブロックされます。

編集

リクエストが JSONP であることを見逃していました。その場合async: falseは機能しません (クロスドメイン要求と JSONP では機能しません)。したがって、とにかくコールバックを使用する必要があります。

于 2012-06-26T10:59:43.017 に答える
5

リチャードの仲間!

これはスコープの問題ではなく、実行の問題です。successとオプションはどちらもerrorイベント ハンドラーであり、非同期で実行されます (したがって、AJAX と呼ばれます)。これは基本的に、 orイベントがトリガーされる前にalert(results)andreturn resultsが実行される可能性があり、実行される可能性が高いことを意味します。successerror

于 2012-06-26T10:57:10.397 に答える
1

ajax は非同期であるため、ajax が完了する前にアラートが実行されます。ajax リクエストが作成されて処理されるまでスクリプトの実行を停止するには、ajax call async プロパティを false に設定する必要があります。

ただし、jQuery docs は次のように述べています。

async デフォルト: true デフォルトでは、すべてのリクエストが非同期で送信されます (つまり、これはデフォルトで true に設定されています)。同期リクエストが必要な場合は、このオプションを false に設定します。クロスドメイン リクエストと dataType: "jsonp" リクエストは、同期操作をサポートしていません。同期リクエストはブラウザを一時的にロックし、リクエストがアクティブな間はすべてのアクションを無効にする場合があることに注意してください。jQuery 1.8 以降、async: false の使用は非推奨になりました。

于 2012-06-26T10:56:28.870 に答える
1

スクリプトが応答を待たずに AJAX 要求が送信されます。これが Dave Newton が意味するものA-synchronusであり、成功コールバック関数内にアラートを配置すると、実際の応答が何であるかがわかります。

asyncまたは、プロパティを指定して に設定しfalse、続行する前にスクリプトが応答を待機するように強制することもできます。

于 2012-06-26T10:58:21.760 に答える