我希望我问的问题是正确的,但本质上,NodeJS中有没有办法让CommonJS模块在(长)计算后返回数据流而不是最终的数据块?假设有不止一种方法,那么这些技术是什么?
例如,假设我有一个findPrimes
函数,写成CommonJS模块:
查找素数.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;
};
如您所见,此函数返回一个包含所有小于其输入的素数的数组。它在计算完所有这些数字后返回数组。
所以,假设我在节点脚本中使用这个模块
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));
当我使用 arg 运行上述脚本时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...
虽然这可行,但理想情况下,我希望程序在完成之前开始写出它计算的数字。
所以我的程序仍然需要一段时间才能运行,但它开始向屏幕输出信息的速度比“先计算一切,然后输出所有结果”要快得多。
我愿意接受任何和所有的技术,谢谢。