在node.js中编写嵌套的非阻塞循环

时间:2016-11-29 15:46:28

标签: javascript node.js

如何正确编写Node.Js中的以下循环集,而不会阻塞事件循环或不会导致内存不足错误。

到目前为止,我所尝试的内容包括

  • setImmediate()/ setInterval()
  • 的组合
  • 异步模块see my code here
  • Thread_a_gogo(此模块不再维护)

代码。

for(var i = 0; i < 2000; i++)
    for(var j = 0; i < 2000; j++)
        for(var k = 0; k < 2000; k++)
            console.log(i + ":" + j + ":" + k);

还创建了一个JSFiddle来玩here

2 个答案:

答案 0 :(得分:1)

不确定您的用例是什么。 Javascript是阻塞的,因为它是单线程的,它必须在转移到其他东西之前运行循环。

例如,您可以使用生成器在事件上运行每次迭代。

function* ticker() {
  for(let i = 0; i < 10; i++)
    for(let j = 0; i < 10; j++)
        for(let k = 0; k < 10; k++)
            yield[i, j, k];
}

const gen = ticker();

setInterval(() => console.log(gen.next().value), 500);

console.log('I am at the end (called straight away)');

答案 1 :(得分:1)

您需要合并setImmediate / setTimeout / etc。使用async.js库。 async.each仅用于编排,它本身并不提供任何异步。

function getPerm(reducedWordList, callback) {
    var sevenLtrWords = _.filter(reducedWordList, word => word.length == 7); 
    var fourLtrWords = _.filter(reducedWordList, word => word.length == 4); 

    async.each(sevenLtrWords, (i, cb) => {
        async.each(sevenLtrWords, (j, cb) => {
            async.each(fourLtrWords, (k, cb) => {
                console.log(i + " " + j + " " + k); 
                setTimeout(cb, 0);
            }, cb);
        }, cb);
    }, callback);
}