【发布时间】:2017-11-10 15:55:08
【问题描述】:
我希望我问的问题是正确的,但本质上,NodeJS 中有没有办法让 CommonJS 模块返回数据流而不是最终确定的(长时间)计算后的数据块?假设有不止一种方法,那么这些技术是什么?
例如,假设我有一个 findPrimes 函数,写成 CommonJS 模块:
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;
};
如您所见,此函数返回一个由所有小于其输入的素数组成的数组。它在计算所有这些数字之后返回数组。
所以,假设我要在节点脚本中使用这个模块
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 的 arg 运行上述脚本时,我得到以下(预期的)输出:
$ 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...
虽然这可行,但理想情况下,我希望程序在完成之前开始写出它计算出的数字。
所以我的程序仍然需要一段时间才能运行,但它会比“先计算所有内容,然后输出所有结果”更快地开始向屏幕输出信息。
实现这种效果的最佳方法是什么? Streams? Promises?
我愿意接受任何和所有这方面的技术,谢谢。
【问题讨论】:
-
通过回调可能吗? (最简单的不是最好的)
-
你必须使用 Stream nodejs 类
标签: javascript node.js npm node-streams