【发布时间】:2014-06-29 08:08:36
【问题描述】:
我在前端 Javascript 中有这样的东西:
function myfunc() {
for (var i=0; i<=1000000000; i++)
// Do something
return data;
}
我想以异步方式调用myfunc(),以便我可以传递回调而不是等待循环完成。
有没有办法做到这一点?我可以使用或不使用AngularJS / jQuery
更新 1:
“做某事”部分中的内容只是基本的数学计算。一次迭代不需要太多时间,但是因为循环的数量,这会阻塞浏览器。
没有 ajax 请求,我打算不在 Node.js 服务器端执行此操作。
更新 2:
我只想更具体地谈谈“做某事”部分。是帆布加工。见
https://github.com/girliemac/Filterous/blob/master/src/filterous.js#L73
for (var i = 0; i < d.length; i += 4) {
var r = d[i];
var g = d[i + 1];
var b = d[i + 2];
// CIE 1931 luminance
var avg = 0.2126*r + 0.7152*g + 0.0722*b;
// d is a reference to pixels.data, so you do not need to reassign it
d[i] = d[i + 1] = d[i + 2] = avg
}
也许有一种方法可以使这种异步方式不会冻结浏览器或 iOS Safari 2 秒。这在移动设备上非常明显。
【问题讨论】:
-
使用WebWorker。
-
您不需要网络工作者或承诺(尽管承诺可以帮助您区分成功和错误,并在需要时进行链式执行)。只需接受一个函数作为
myFunc函数的第一个参数,并在您处理完您正在做的任何事情时调用它。请注意,在这里使用回调系统不会改变for循环(如果那是您的真实代码)无论如何都会阻塞任何异步的事实。如果这是您的代码,您将不得不使用 Web Worker 来克服循环的同步特性 -
//Do something发生了什么?如果有一个(或在这种情况下为 1000000000)HTTP 请求隐藏在其中,那么所有 OP 需要的是在一切完成后的回调。如果那里没有任何异步发生,那么是的,网络工作者。
标签: javascript jquery angularjs asynchronous promise