让节点模块返回数据“流”的技术?

时间:2017-06-08 19:29:27

标签: javascript node.js npm node-streams

我希望我能正确地提出这个问题,但实质上, NodeJS 是否有办法让 CommonJS 模块返回数据流而不是最终确定(长)计算后的数据块?假设有多种方法,那些技术是什么?

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

找到-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...

虽然这是有效的,但理想情况下我希望程序在它完成之前开始写出它已计算出的数字。

所以我的程序仍然需要一段时间才能运行,但它会比“首先计算所有内容然后输出所有结果”更快地开始向屏幕输出信息。

实现这种效果的最佳方法是什么? StreamsPromises

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

2 个答案:

答案 0 :(得分:2)

您必须使用nodejs中的Stream类,并且该方法应该导出带有流的回调,如评论所述:

ConstraintSet set = new ConstraintSet();
set.clone(mConstraintLayout);
set.connect(mProgressBar.getId(), ConstraintSet.LEFT, R.id.guideline_category_left, ConstraintSet.LEFT, 0);
set.connect(mProgressBar.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
set.applyTo(mConstraintLayout);

答案 1 :(得分:1)

您可以使用Node.js的stream模块。在几行代码中很难回答你的问题,但是如果你真的对流的工作方式感兴趣,请看看this video(这是我给出的关于Node的讨论。在德国慕尼黑的Node.js聚会上的js流。)

或者,您可以使用带有yield的生成器函数,但这也很难从头开始解释。

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