0

私は、負荷の高いコンピューティングを実行すると同時に、ユーザーフレンドリーである必要がある JavaScript クライアント側プロジェクトに取り組んでいます。これはもちろん非同期機能を意味しますが、コンピューターが重いタスクを実行している間にユーザーが何かを実行できるようにすることも意味します。

これを非同期ループの例として取り上げます。

function async_operation(){

    function do_stuff(){
        var i=0;
        while(i<1000000000){
            ... //do some stuff (to be more specific: localforage.setItem)
            ++i;
        }
    }

    setTimeout(do_stuff, 0);

    //do next opearions...
}

このループは完全かつ非同期に機能します。問題は、ユーザーが何か、たとえば次のボタンをクリックした場合です。

<button onclick="alert('hello')">click me</button>

ループが終了した直後に警告メッセージが表示されます! そのため、ユーザーは機能が終了するまで何もクリックできません。

このタスク中にユーザーがいくつかのイベントをトリガーできるようにする方法はありますか?

4

1 に答える 1

3

while ループを再帰関数に置き換えます。

を使用して、関数の各反復を呼び出しますsetTimeout

function do_stuff() {
   var i = 0;
   really_do_stuff();

   function really_do_stuff() {
      //do some stuff (to be more specific: localforage.setItem)
      ++i;
      if (i < 1000000000) {
          setTimeout(really_do_stuff, 1);
      } else {
          //do next opearions...
      }
   }
}

内部で while ループを使用して、遅延が発生する (したがってパフォーマンスが低下する)よりreally_do_stuffも大きいバッチ サイズを使用できるようにすることができます。1setTimeout

于 2015-02-04T16:45:45.283 に答える