jQueryを使用して関数に$ .getデータを返す
-
08-07-2019 - |
質問
jQueryコードを含む関数を呼び出そうとしています。この関数がjQueryステートメントの結果を返すようにします。動作していません。理由を解明しようとしています。
function showGetResult (name) {
var scriptURL = "somefile.php?name=" + name;
return $.get(scriptURL, {}, function(data) { return data; });
}
alert (showGetResult("John"));
アラートには" [object XMLHttpRequest]
が表示されます。"ただし、関数の外でjQueryステートメントを単独で実行すると、正常に動作します-> $。get(scriptURL、{}、function(data){alert(data);})
$。get
データを返す関数内にコードを配置することで、このコードを再利用できるようにしたいと思います。ここでどんな根本的な間違いを犯していますか?
解決
いくつかの異なる間違いがあります。まず、$。getはコールバック関数の戻り値を返しません。 XHRオブジェクトを返します。次に、get関数は同期的ではなく、非同期であるため、getGetResultはgetが完了する前に戻る可能性があります。第三に、コールバック内部から外部スコープに何かを返すことはできません。ただし、外部スコープで変数をバインドし、コールバックで設定できます。
必要な機能を取得するには、$。ajaxを使用し、asyncオプションをfalseに設定する必要があります。次に、外部スコープで変数を定義し、ajaxコールバックで変数を割り当てて、関数からこの変数を返します。
function showGetResult( name )
{
var result = null;
var scriptUrl = "somefile.php?name=" + name;
$.ajax({
url: scriptUrl,
type: 'get',
dataType: 'html',
async: false,
success: function(data) {
result = data;
}
});
return result;
}
ただし、非同期呼び出しから同期呼び出しに変更するのではなく、コールバック関数自体で必要な処理を行う方法を見つけて、サービスを提供した方がよいでしょう。
他のヒント
あなたが犯している根本的な間違いは、AJAX呼び出しが非同期に行われることです。そのため、戻るまでに結果はまだ準備できていません。これを機能させるには、次のようにコードを変更できます。
$(function() {
showGetResult('John');
});
function showGetResult (name) {
$.get('somefile.php', {
// Pass the name parameter in the data hash so that it gets properly
// url encoded instead of concatenating it to the url.
name: name
}, function(data) {
alert(data);
});
}
同期リクエストが必要なようです: 入手方法非同期ではなく同期Ajaxリクエストを実行するjQuery?
または、コールバックを関数に渡すこともできます。
function showGetResult (name, callback) {
var scriptURL = "somefile.php?name=" + name;
return $.get(scriptURL, {}, callback);
}
showGetResult("John", function(data){ alert(data); });
根本的な間違いは「非同期」ですAJAXの一部。サーバーが応答を返送するのにかかる時間はわからないため、AJAXメソッドは決して「ブロック」しません。 -つまり、サーバーにコールアウトせず、結果を待つためにそこに座っているだけです。代わりに、他の何かに進みますが、結果が戻ったときに起動する「コールバック」と呼ばれるメソッドを設定します。このメソッドは、データに対して行う必要のあることをすべて実行します(たとえば、ページにデータを挿入します)。
これは間違った方法です。 function(data)はコールバック関数なので、 return $ .get が実行されるたびに、コールバック関数が呼び出されなかった可能性があります。
function(data)メソッドから投稿データ取得関数を呼び出す方が良い。
効率的な方法は、jQueryのDeferredメソッドを使用することです。サーバーへの同期/非同期要求と、deferred.resolve()の待機の両方を行い、遅延Promiseオブジェクトを返します。少々退屈に見えますが、大規模なデータを扱うには少し勉強するだけで十分です。 (この場合、tvanfossonの機能はうまく機能しますが、Googleの分析データに取り組んでいたとき、大量の情報に夢中になっていたため、このソリューションを見つける必要があります)
function showResults(name) {
var deferred = $.Deferred, requests = [];
requests.push($.ajax({url:"/path/to/uri/?name=" + name, type: "GET", async: false}).done(function(d) {
//alert or process the results as you wish
}));
$.when.apply(undefined, requests).then(function() { deferred.resolve(); });
return deferred.promise();
}
返されたpromiseオブジェクトは、 $。when(showResults( 'benjamin'))。done(function(){});
とともに使用して、ポスト変更(チャート/グラフ設定など)にも使用できます。 )。完全に再利用可能です。
この関数は、次のような$ .deferredリクエストのループに入れることもできます。
function updateResults() {
var deferred = $.Deferred, requests = [];
requests.push($.ajax(url:"/path/to/names/?nameArr=" + jsonArrOfNames, type: "GET", async: false}).done(function(res) { requests.push(showResults(res[0]));}) );
$.when.apply($, requests).then(function() { deferred.resolve(); });
return deferred.promise();
}