让节点模块返回一个“数据stream”的技术?

我希望我正确地问这个问题,但本质上,是否有一种方法在NodeJS有一个CommonJS模块返回一个数据stream,而不是一个(长)计算后的最终数据块? 假设有不止一种方法,这些技术是什么?

例如,假设我有一个用CommonJS模块编写的findPrimes函数:

find-primes.js

 /** * @module findPrimes * @param {int} n - Find all primes less than this number * @return {array} */ module.exports = function(n) { if (n < 2) { return []; } else if (n === 2) { return [2]; } var primes = [2]; for (let i = 3; i < n; i += 2) { let is_prime = true; let sq = Math.ceil(Math.sqrt(i)); for (let t = 2; t <= sq; t++) { if (i % t === 0) { is_prime = false; break; } } if (is_prime) { primes.push(i); } } return primes; }; 

正如你所看到的,这个函数返回一个小于其input的所有素数的数组。 它计算了所有这些数字返回数组。

所以,说我去节点脚本中使用这个模块

index.js

 const primes = require('./find-primes.js'); // Usage: `node index.js <num>` let primes_less_than = process.argv[2]; console.log(primes(primes_less_than)); 

当我以25的参数运行上面的脚本,我得到以下(预期)输出:

 $ node index.js 25 [ 2, 3, 5, 7, 11, 13, 17, 19, 23 ] 

但是,比如说,我通过了一个更大的数字,比如10,000,000

 $ node index.js 10000000 # Takes a while to run before outputting the numbers... 

虽然这个工作,理想情况下,我希望程序开始写出它计算之前计算的数字。

所以我的程序仍然需要一段时间才能运行,但是它比“先计算所有东西然后输出所有结果”要快得多。

达到这个效果的最好方法是什么? 溪stream ? 诺言 ?

我愿意接受任何技术,谢谢。

您将不得不使用nodejs中的Stream类,并且该方法应该像注释所示的那样使用stream导出callback:

 const stream = require('stream'); function getPrimesStream(n, cb) { const primesStream = new stream.Stream(); cb(null, primesStream); if (n >= 2) { primesStream.emit('data', 2); } const primes = [2]; for (let i = 3; i < n; i += 2) { let isPrime = true; const sq = Math.ceil(Math.sqrt(i)); for (let t = 2; t <= sq; t += 1) { if (i % t === 0) { isPrime = false; break; } } if (isPrime) { primesStream.emit('data', i); primes.push(i); } } return primes; } getPrimesStream(1000, function (err, stream) { stream.on('data', function (data) { console.log(data); }); stream.on('end', function() { console.log('finished'); }); }); 

你可以使用Node.js的stream模块。 在几行代码中很难回答你的问题,但是如果你真的对stream的工作方式感兴趣的话,可以看一下这个video (这是我在Node.js聚会上的一个关于Node.jsstream的讨论,德国)。

另外,你也可以使用带有yield的generator函数,但这也很难在几行中从头开始解释。

无论如何, stream生成器函数是您应该查找的术语。