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这样你的批量大小就可以大于1因为setTimeout会引入延迟(从而导致性能损失)。

于 2015-02-04T16:45:45.283 回答