$ .getJSON呼び出しにasync:falseを設定することは可能ですか?


105

async: false呼び出し時$.getJSON()に非同期ではなくブロックするように設定することは可能ですか?


1
コードをコールバックに挿入するだけです。これが非推奨である理由があります。これは悪い考えです
Milney

1
@Milney —非常に奇妙です…公式に非推奨です。実際には、そうではありません。それが本当に非推奨であった場合、同期AJAX呼び出しまたは$ ajax.setupスイッチのいずれかを実行する可能性はjQuery 3で削除されました。実際、同期呼び出しは、たとえば、最初のバッチに依存する他のグローバルがある場合のJSONデータ。(コールバック関数に初期化プロセス全体をパックすることは、特定の状況下では非常に難しい場合があります。)
Brice Coustillas

同期XHRリクエストまたは再構築コードがこのケースに答えると思います。
チェタバハナ2018年

回答:


154

次のように、$.ajax()それを使用して呼び出しを同期的に行う必要があります。

$.ajax({
  url: myUrl,
  dataType: 'json',
  async: false,
  data: myData,
  success: function(data) {
    //stuff
    //...
  }
});

これは、現在次の$.getJSON()ように使用すると一致します。

$.getJSON(myUrl, myData, function(data) { 
  //stuff
  //...
});

23
私は便利なメソッド$ .getJSON()がほとんど役に立たないことがわかり、常に$ .ajax()を使用することになります。
Jacob Marble

これをPOST呼び出しにも使用できますか?
Hitesh 2014

@hiteshはい、type: 'POST'オプションを追加して投稿に変換します。async: falseただし、本当に必要な場合以外使用しないでください。UI がロックされます。
Nick Craver

1
この場合、「myData」とは何ですか?データを削除すると、myDataは完全に機能します。ajax呼び出しはかなり新しいです。
nclsvh 2015

2
次の新しい問題にぶつかっただけです:「ワーカーの外部にある同期XMLHttpRequestは、エンドユーザーのエクスペリエンスに悪影響を与えるため、Webプラットフォームから削除されています(これは長いプロセスであり、長いプロセスです。)エントリ設定オブジェクトのグローバルオブジェクトがWindowオブジェクトである場合、async引数にfalseを渡さないでください。ユーザーエージェントは、開発者ツールでのこのような使用について警告することを強くお勧めします。また、発生したときにInvalidAccessError例外をスローして実験する場合があります。」
Ken Sharp

46

どちらの答えも間違っています。あなたはできる。電話する必要があります

$.ajaxSetup({
async: false
});

json ajax呼び出しの前。そして、あなたは呼び出しの戻りの後にそれをtrueに設定することができます(それらを非同期にしたい場合は、ページでajaxの他の使用法がある場合)


1
私はドキュメントのその部分を読み直しました。ここにajaxSetupについて話す部分 があります:api.jquery.com/jQuery.ajaxSetupそしてここにオプションがあります:api.jquery.com/jQuery.ajax それは明確に言っています: "asyncデフォルト:trueデフォルトでは、すべてのリクエストは非同期に送信されます(つまり、これはデフォルトでtrueに設定されています。同期リクエストが必要な場合は、このオプションをfalseに設定してください。クロスドメインリクエストとdataType: "jsonp"リクエストは同期操作をサポートしていません。 "JSONPはJSONではないので、最初から。時間があるときに後で例を書くつもりです。
velja 2011

7
これは遅いコメントですが...間違っている「両方」の回答はどれですか?@Nick Craverからの回答が受け入れ可能であり、グローバルAJAX設定で「混乱」していないことがわかります(他のリクエストが同時に発生する場合)
scunliffe 2013年

1
動作しますが、これはページで行うすべてのajaxリクエストに適用されます。だから私はお勧めしませんので反対投票します
GabrielBB '25

3
これは非常に質の低い回答です
ブライアンウェブスター

1
-1:同期をとることはコストがかかる可能性があります。これは、プロジェクトで毎回絶対に必要でない限り、間違いなくコールごとに行う必要があります。あなたの答えは、あなたが世界的にすべての呼び出し設定することを示唆している$.ajax(とその後の速記ラッパーすなわち$.getJSON$.get同期する、など)。さらに、ドキュメントではこれを使用しないことも推奨されています:「説明:将来のAjaxリクエストのデフォルト値を設定します。その使用は推奨されません。」
Carrie Kendall

18

どちらも正しいと思います。後者の答えはうまくいきますが、それはグローバルオプションを設定するようなものなので、次のことを行う必要があります:

    $.ajaxSetup({
        async: false
    });

    //ajax call here

    $.ajaxSetup({
        async: true
    });

10

私の場合、ジェイDが正しいです。これを電話の前に追加する必要があります。

$.ajaxSetup({
    async: false
});

私の以前のコードでは、私はこれを持っています:

var jsonData= (function() {
    var result;
    $.ajax({
        type:'GET',
        url:'data.txt',
        dataType:'json',
        async:false,
        success:function(data){
            result = data;
        }
    });
    return result;
})();
alert(JSON.stringify(jsonData));

それは動作します。次に私は

var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

アラートは未定義です。

これらの3行を追加すると、アラートにデータが再び表示されます。

$.ajaxSetup({
    async: false
});
var jsonData= (function() {
    var result;
    $.getJSON('data.txt', {}, function(data){
      result = data;
    });
    return result;
})();
alert(JSON.stringify(jsonData));

1

awaitコードのネストを回避する必要があるだけの場合:

let json;
await new Promise(done => $.getJSON('https://***', async function (data) {
    json = data;
    done();
}));

0

そこにそのオプションを設定することはできないと思います。適切なパラメーターを指定してjQuery.ajax()を使用する必要があります(基本的に、getJSONはその呼び出しをより簡単なAPIにラップするだけです)。


0

自分でロールする

function syncJSON(i_url, callback) {
  $.ajax({
    type: "POST",
    async: false,
    url: i_url,
    contentType: "application/json",
    dataType: "json",
    success: function (msg) { callback(msg) },
    error: function (msg) { alert('error : ' + msg.d); }
  });
}

syncJSON("/pathToYourResouce", function (msg) {
   console.log(msg);
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.