1

非同期操作の調整に頭を悩ませようとしています。理解するのに少し助けが必要です:

  1. while ループを使用して操作が完了するのを待つのはよくない考えであり、機能しないのはなぜですか。
  2. jQuery 関数でコールバックを使用するための実行可能な代替手段がある場合

ほとんどの場合、$.get() のような非同期関数にコールバックを追加するとうまくいきます。ただし、これはある程度、コードがどのように記述されているかを決定しますが、これは私が好きではありません。

$(function() {

    var r = AjaxResults( page );

    // loop prevents further processing until GetResults() is done
    while( isComplete == false )
    isComplete = $('body').data('isComplete');

    // reset isComplete boolean
    $('body').data('isComplete', false);

    // this will only continue after GetResults() has exited
    paintTheTownRed();
    var whateverElse = true;
});

function AjaxResults( page ) {

   // do something before async operation
   switch( page ){
       case '1': {...} break;
       ...
       default: break;
   } 

   $.getJSON("/controller/page", null, function(data) {

       // do something after async operation
       {...}

       $('body').data('isComplete', true);
       return data;
   });
}
4

5 に答える 5

8

それは私のCPUを急上昇させ、私を大いに苛立たせるからです.

コードを記述する場所は、非同期/同期によって決定されることはほとんどありません。関数は、匿名でインラインで記述されているか、名前が付けられて参照として渡されているかに関係なく、関数です。

また、promise とdeferred オブジェクトは、機能を実装する場所と方法を決定するのに役立ちます。

追加の詳細とアイデアについては.when(ドキュメント)などを参照してください。ただし、他の使用方法もあります。

于 2012-07-13T17:06:02.043 に答える
2

一言で言えば、これを行うべきではありません。ユーザー エクスペリエンスが非常に悪くなり、ほとんどまたはすべての視聴者をひどく苛立たせることになるからです。せいぜい、CPU をスパイクし、ビューアーのバッテリーを不必要に消耗させるだけです。最悪の場合、視聴者はブラウザがフリーズ/ハングしたと考えるでしょう。

JavaScript はシングル スレッドであり、そのシングル スレッド性はブラウザーでのユーザー イベント処理に結び付けられているため、while ループを使用して非同期イベントが終了するのを待ってループすると、while ループの時間中にブラウザーがロックされます。また、一部のブラウザーでは、JavaScript の実行時間が長すぎるという警告がユーザーに表示されることもあるでしょう。

現在、javascript での非同期プログラミング用の何らかのタイプのコールバックに代わるものはありません。非同期操作を使用する場合は、優れたユーザー エクスペリエンスを維持するために、プログラミング スタイルをその動作に適応させる必要があります。はい、これはプログラミング スタイルを適応させることを意味しますが、それは優れたユーザー エクスペリエンスを維持するために支払う代償です。 それを調べたい場合は、遅延オブジェクトを使用すると、コードの記述スタイルが少し楽になります (コールバックですが、それほどではないように見えます)。

あなたが提案していたことを行うことは、ユーザーエクスペリエンスよりもプログラミングの利便性を優先することになります。これは、目的/優先順位が後退しているように見える悪い/怠惰なプログラマーの兆候にすぎません.

参考までに、これは、許可されていて機能する環境 (ネイティブ Windows 開発など) であっても、悪いプログラミング手法です。

于 2012-07-13T17:08:33.157 に答える
1

ほとんどの場合、次のような非同期関数にコールバックを追加すると$.get()うまくいきます。ただし、これはある程度、コードがどのように記述されているかを決定しますが、これは私が好きではありません。

コールバックを AJAX 関数に直接追加する必要はなくなりました。

jQuery遅延オブジェクトを使用して、過度のネストを行わずに、必要な場所にコードを記述できるようにします。

function AjaxResults( page ) {
    ...  // prep
    return $.getJSON("/controller/page", null)
        .done(function(data) {
            // always do this
        });
}

AjaxResults(page).done(paintTheTownRed);

ここに示すように、必ず独自のcompleteハンドラーを配置してください。ただし、オブジェクトを返すことで、多くのコールバックを渡したり、コードをネストしたりすることなく、余分なことを行う機会が得られます。$.getJSONjqXHR

于 2012-07-13T17:11:36.993 に答える
0

$.get() で呼び出される関数を定義したくないという問題がある場合は、必ずそれを別の関数として記述してください。

$(function() {

    AjaxResults( page );

});

function AjaxResults( page ) {

   // do something before async operation
   switch( page ){
       case '1': {...} break;
       ...
       default: break;
   } 

   $.getJSON("/controller/page", null, doWhatever);
}

function doWhatever(data) {
    paintTheTownRed();
    var whateverElse = true;
}
于 2012-07-13T17:12:42.913 に答える
0

まあ、うまくいかないから仕方ないですよね。whileループにいるため、コールバック関数は呼び出されないため、ブール値は変更されずtrue、無限ループになります

さて、実際の同期要求が悪い考えである理由は、UI がフリーズし、タブがクラッシュしたと思わせるからです。しかし、はい、同期要求はコールバックの代わりになります。

于 2012-07-13T17:13:00.627 に答える