如何在不阻塞事件循环的情况下定期运行任务?

时间:2016-04-14 17:34:54

标签: javascript node.js event-loop

我有一段在大型数组上运行的代码:

for (i = 0; i < cars.length; i++) { 
    cars[i] = some_function(cars[i]) ;
}

我应该间隔运行此代码而不阻塞事件循环。什么是正确的方法呢?

2 个答案:

答案 0 :(得分:3)

对于没有阻止事件循环的部分,您有两个选项,甚至可能更多:

  1. 将您的工作加载到child processworker
  2. 使用process.nextTicksome_function内处理您的处理,以便控制回块之间的事件循环
  3. 如果可以进行分块,你必须弄明白,因为没有你的功能细节。

    对于部分间隔,您应该将代码包装在setInterval

答案 1 :(得分:3)

有一个很好的异步处理程序库叫做Bluebird,它正在成为NodeJS异步协调的主要工具。

Bluebird有一个非常有用的方法对,用于处理数组:mapmapSeries。它使用起来很简单,允许您在不阻塞事件循环的情况下迭代数组,并使代码具有可读性:

var Promise = require('bluebird'),
    cars = ['a', 'b', 'c'];

// Iterate across cars without blocking the event loop. Each
// callback will be made in PARALLEL:
// @see http://bluebirdjs.com/docs/api/promise.map.html
Promise.map(cars, function(car) {
    console.log("I'm logging car ' + car + ' but could be any complex code...');
});

// Iterate across cars without blocking the event loop. Each
// callback will be made in SERIES. An item will be fully processed
// before moving on to the next:
// @see http://bluebirdjs.com/docs/api/promise.mapseries.html
Promise.mapSeries(cars, function(car) {
    console.log("I'm logging car ' + car + ' but could be any complex code...');
});