我有一段在大型数组上运行的代码:
for (i = 0; i < cars.length; i++) {
cars[i] = some_function(cars[i]) ;
}
我应该间隔运行此代码而不阻塞事件循环。什么是正确的方法呢?
答案 0 :(得分:3)
对于没有阻止事件循环的部分,您有两个选项,甚至可能更多:
process.nextTick
在some_function
内处理您的处理,以便控制回块之间的事件循环如果可以进行分块,你必须弄明白,因为没有你的功能细节。
对于部分间隔,您应该将代码包装在setInterval
。
答案 1 :(得分:3)
有一个很好的异步处理程序库叫做Bluebird,它正在成为NodeJS异步协调的主要工具。
Bluebird有一个非常有用的方法对,用于处理数组:map
和mapSeries
。它使用起来很简单,允许您在不阻塞事件循环的情况下迭代数组,并使代码具有可读性:
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...');
});