1

サイトにカレンダー コントロールがあります。ajax リクエストを使用して、サーバーから可用性データをフェッチします。ここにコードがあります -

var monthlyBookingDetails = getBooking(month, year);//getBooking is ajax function
//rest of code 

ここでgetBooking関数で async: false を作成すると、機能しますが、ajax リクエストが処理されるまでブラウザーがブロックされます。

だから私は方向転換を次のように考えました-

while(monthlyBookingDetails.length <= 0){//busy waiting}

しかし、これは適切な方法ではないと感じているので、忙しい待機を行う正しい方法を理解し、次の行をブロックして実行したいだけです。

4

1 に答える 1

1

このコードには問題があります。その通りです:

while(monthlyBookingDetails.length <= 0){//busy waiting}

monthlyBookingDetailsつまり、「次の値以下になるまで無限ループを実行する」ということ0です。意図的に無限ループを導入することは (たとえそれらが最終的に破られるとしても) 賢明な動きではない可能性があります。特に、AJAX が失敗した場合、無限ループは壊れません。

これを行う正しい方法は、非同期の方法を採用することです。それはコールバックを意味します。これは、非同期コードが完成したときに呼び出される関数を提供することを意味します。

したがって、内部では次のgetBookingようにします。

function getBooking(month, year, callback) {
    $.ajax({
        /* all your settings */
        success: function() {
            callback(); // call the callback function
        }
    });
}

次に、次のように関数を呼び出します。

getBooking(month, year, function() {
    /* your code here */
});

jQuery をよく使用している場合、このパターンはおそらくおなじみでしょう。これは、AJAX やアニメーションなど、あらゆる種類の非同期アクションに存在します。

ほとんどの場合、コールバックにデータを渡したいと思うでしょう。これは通常の方法でcallback(data)行いgetBooking(month, year, function(data) {ます。

于 2013-07-11T07:46:12.187 に答える