59

ここに私が実行したいいくつかのコードがあります。サーバーから何かを返すことができるように、AJAX 応答を待ちたいと思います。これを達成する方法はありますか?

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: function(data) {
            return data;
        }
    });

    //Wait for AJAX (???)
}

var response = functABC();
4

7 に答える 7

51

新規、jqueryのpromise実装を使用:

function functABC(){

  // returns a promise that can be used later. 

  return $.ajax({
    url: 'myPage.php',
    data: {id: id}
  });
}


functABC().then( response => 
  console.log(response);
);

よく読んでください

これは実際には「同期」ではありませんが、OPが意図することを達成していると思います。

古い、(jqueryのasyncオプションは非推奨になりました):

すべてのAjax呼び出しは、非同期(コールバック関数を使用します。これは「success」キーの後に指定される関数になります)または同期的に実行できます。サーバーが応答するのを効果的にブロックして待機します。同期実行を取得するには、指定する必要があります

async: false 

ここで説明されているように

ただし、ほとんどの場合、(成功時のコールバックを介した)非同期実行で問題ないことに注意してください。

于 2012-09-27T06:22:40.833 に答える
23

簡単な答えはオフにすることasyncです。しかし、それは間違ったことです。正解は、残りのコードの書き方を再考することです。

これを書く代わりに:

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: function(data) {
            return data;
        }
    });
}

function foo () {
    var response = functABC();
    some_result = bar(response);
    // and other stuff and
    return some_result;
}

次のように記述します。

function functABC(callback){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: callback
    });
}

function foo (callback) {
    functABC(function(data){
        var response = data;
        some_result = bar(response);
        // and other stuff and
        callback(some_result);
    })
}

つまり、結果を返す代わりに、コールバックとして実行する必要があるコードを渡します。既に示したように、コールバックは、関数呼び出しと同じ数のレベルにネストできます。


非同期をオフにするのは間違っていると私が言う理由の簡単な説明:

非同期をオフにすると、ajax 呼び出しを待機している間、ブラウザーがフリーズします。ユーザーは何もクリックできず、スクロールできません。最悪の場合、ユーザーのメモリが不足している場合、ユーザーがウィンドウを画面からドラッグして再度ドラッグすると、ブラウザーがフリーズしてスクロールできないため、空のスペースが表示されることがあります。再描画します。IE7 のようなシングル スレッド ブラウザの場合はさらに悪化します。すべての Web サイトがフリーズします。これを経験したユーザーは、あなたのサイトにバグがあると思うかもしれません。本当に非同期で処理したくない場合は、バックエンドで処理を行い、ページ全体を更新してください。少なくともバグではないと感じます。

于 2012-09-27T06:42:55.040 に答える
0

このコードを試してください。それは私のために働いた。

 function getInvoiceID(url, invoiceId) {
    return $.ajax({
        type: 'POST',
        url: url,
        data: { invoiceId: invoiceId },
        async: false,
    });
}
function isInvoiceIdExists(url, invoiceId) {
    $.when(getInvoiceID(url, invoiceId)).done(function (data) {
        if (!data) {

        }
    });
}
于 2020-12-28T13:50:21.830 に答える
-2

async:falseURLとデータとともに属性を使用します。これは、ajax呼び出しをすぐに実行するのに役立ち、サーバーからデータをフェッチして使用できます。

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        async:false
        success: function(data) {
            return data;
        }
    });
}
于 2012-09-27T06:19:52.260 に答える
-3

方法1:

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        success: function(data) {
            return data;
        },
        complete: function(){
              // do the job here
         }
    });
}

var response = functABC();

方法2

function functABC(){
    $.ajax({
        url: 'myPage.php',
        data: {id: id},
        async: false,
        success: function(data) {
            return data;
        }        
    });

   // do the job here
}
于 2012-09-27T06:19:55.390 に答える