jQuery:同期AJAXリクエストの実行


187

私は過去にjQueryをいくつか実行したことがありますが、これには完全にこだわっています。私は同期ajax呼び出しを使用することの長所と短所について知っていますが、ここではそれが必要になります。

リモートページは読み込まれますが(firebugで制御されます)、戻り値は表示されません。

関数が適切に戻るようにするにはどうすればよいですか?

function getRemote() {

    var remote;

    $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success : function(data) {
            remote = data;
        }
    });

    return remote;

}

コードは正常に見えます。それは何を返しますか?jsエラーはありますか?
ShankarSangoli 2011

11
皮肉なことに、「非同期JavaScript&XML」操作を同期的に実行する方法を尋ねています。あなたが本当に実行する必要があるのは「SJAX」です。
VitalyB 2014年

3
注:仕様では、同期AJAXリクエストのサポートが終了しています。
レオ・ラム

2
「[同期]が必要になる」という記述は、JavaScriptエンジンの理解の欠如を示しているため、設計が不十分なアプリです。本当に同期が必要な場合があるのか​​教えてください。
pmont 2015

15
@pmont seems that the statement "[synchronous] will be required" indicates a lack of understanding of JavaScript engines, thus a poorly architected app.または非常によく理解してください。AJAX呼び出しを行う場合onbeforeunloadは、同期リクエストを使用するのが実際に推奨される方法です(そうしないと、リクエストが返される前にブラウザウィンドウが消えてしまうため)。どういうわけか、彼は「私は同期ajax呼び出しを使用することの長所と短所について知っています」とはっきり言っています...たぶん彼を信じますか?
Stijn de Witt

回答:


297

同期リクエストをしているので、それは

function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false
    }).responseText;
}

-http://api.jquery.com/jQuery.ajax/#example-3

注意: asyncプロパティをfalseに設定することは非推奨であり、削除中です(link)。これを使用すると、FirefoxやChromeを含む多くのブラウザで、コンソールに警告が表示され始めます。

クロム:

メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。詳細については、https://xhr.spec.whatwg.org/を確認してください

Firefox:

メインスレッドでの同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため非推奨です。さらにヘルプが必要な場合はhttp://xhr.spec.whatwg.org/


16
responseText常に文字列を返すことに注意してください。あなたはJSONを期待している場合は、ラップ$.ajaxJSON.parse
usandfriends 2014


5
@Tom <i><b>タグもそうでした。私の推奨事項:これらの機能を使い続けて、なくなることのないようにします。
Stijn de Witt

1
これはブラウザをロックするので、タイムアウトを5000程度にオプションに追加することは理にかなっています。
commonpike 2015

1
オブジェクトに解析文字列の場合@usandfriendsはjQuery.parseJSONの代わりに、JSON.parseを使用する方が安全であるstackoverflow.com/questions/10362277/...
AntonE

33

ajax関数を誤って使用しています。同期なので、次のようにデータをインラインで返します。

var remote = $.ajax({
    type: "GET",
    url: remote_url,
    async: false
}).responseText;

17

そのURLはどのくらい離れていますか?同じドメインのものですか?コードは大丈夫に見えます

これを試して

$.ajaxSetup({async:false});
$.get(remote_url, function(data) { remote = data; });
// or
remote = $.get(remote_url).responseText;

うん!同じドメインとすべて。remote_urlは適切に定義され、AJAX呼び出しは前述のように適切に実行されます(firebugで制御されます)。ただノーリターン!
産業

3
function getRemote() {
    return $.ajax({
        type: "GET",
        url: remote_url,
        async: false,
        success: function (result) {
            /* if result is a JSon object */
            if (result.valid)
                return true;
            else
                return false;
        }
    });
}

7
これがOPに役立つ理由を説明してください。
krillgar 2014年

サーバー側からjsonオブジェクトを返すことをお勧めします。これにより、より多くの制御が可能になります。ただし、上記の$ .ajaxパラメータにdataType: "json"を追加する必要があります。
jjwdesign 2015年

これは何を意味しますか:「それはあなたにもっとコントロールを与える」?
grantwparks 2018年

3
関連はありませんが、次のことができます。//これは既にブール値です
dpineda
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.