【问题标题】:Turn for loop to async将 for 循环转为异步
【发布时间】: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


【解决方案1】:

回调是很琐碎的事情

function myfunc(callback) {
  for (var i=0; i<=1000000000; i++)
    // Do something

  callback(data);
}

所以你可以这样称呼它

myfunc(function(data){


});

【讨论】:

  • 虽然我同意,但for 循环将阻止回调的预期异步行为,使其无用。根据他们的代码实际上是什么,他们可能需要 Web Workers
【解决方案2】:

这样称呼

function myfunc() {
  for (var i=0; i<=1000000000; i++)
    // Do something
  return data;
}

$timeout(myfunc, 0);

在你的控制器/服务中注入 $timeout

【讨论】:

  • 有人可以解释一下否决票吗??
猜你喜欢
  • 2017-05-19
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2015-12-03
相关资源
最近更新 更多