javascript - 如何使 while 循环真正异步

标签 javascript asynchronous localforage

我正在开发一个 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>

循环结束后就会弹出警报消息!因此,在该功能完成之前,用户无法单击任何内容。

有什么方法可以让用户在此任务期间触发一些事件吗?

最佳答案

用递归函数替换 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...
      }
   }
}

您可能需要在 really_do_stuff 中使用 while 循环,以便批量大小可以大于 1,因为 setTimeout 会引入延迟(并且因此会造成性能损失)。

关于javascript - 如何使 while 循环真正异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326762/

相关文章:

javascript - Breeze js : navigation property is created but not filled with data

javascript - 在另一个指令的模板上使用 Angular Directive(指令)?

javascript - 执行componentDidMount后无法设置状态

javascript - 如何同步使用localForage

javascript - Ajax 数据 - 对于每个数据

javascript - 将值从内部函数传递到外部函数 - 无法保存密码

javascript - 如何用async/await获取第二个 `then`回调参数?

javascript - 如何在异步函数中调用父类函数

javascript - localForage 使用 WebSQL web IndexedDB 可用

angularjs - 在 webpack 中使用 Angular 和 localForage