如何使 while 循环真正异步
how to make a while loop really asynchronous
我正在开发一个 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 客户端项目,该项目执行一些繁重的计算,同时需要对用户友好。这当然意味着异步功能,但也让用户在计算机执行繁重的任务时做一些事情。
以异步循环为例:
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
会引入滞后(因此会降低性能)。