Javascript 使节点模块返回一个";溪流;数据量?

Javascript 使节点模块返回一个";溪流;数据量?,javascript,node.js,npm,node-streams,Javascript,Node.js,Npm,Node Streams,我希望我问的问题是正确的,但本质上,NodeJS中有没有一种方法可以让CommonJS模块在(长时间)计算后返回数据流,而不是最终的数据块?假设有不止一种方法,这些技术是什么 例如,假设我有一个findpremes函数,作为CommonJS模块编写: find-primes.js 然而,假设我通过了一个更大的数字,比如10000000 $ node index.js 10000000 # Takes a while to run before outputting the numbers...

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

例如,假设我有一个
findpremes
函数,作为CommonJS模块编写:

find-primes.js 然而,假设我通过了一个更大的数字,比如10000000

$ node index.js 10000000
# Takes a while to run before outputting the numbers...
虽然这是可行的,但理想情况下,我希望程序在完成之前开始写出它计算出的数字

因此,我的程序仍然需要一段时间才能运行,但它开始向屏幕输出信息的速度要比“先计算所有内容,然后输出所有结果”快得多

达到这种效果的最佳方法是什么


我对这方面的任何技术都持开放态度,谢谢。

您可以使用Node.js的
模块来实现这一点。用几行代码很难回答您的问题,但如果您真的对流的工作方式感兴趣,请看一看(这是我在德国慕尼黑的Node.js meetup上介绍Node.js流)

或者,您可以使用具有
产量的生成器函数,但这也很难用几行代码从头开始解释


无论如何,streams和generator函数是您应该查找的术语。

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

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');
    });
});
const stream=require('stream');
函数getPrimesStream(n,cb){
常量primesStream=newstream.stream();
cb(空,primesStream);
如果(n>=2){
primesStream.emit('data',2);
}
常量素数=[2];
对于(设i=3;ifor(让t=2;t传递回调可能?(最简单的不是最好的)你必须使用Stream nodejs classI猜测如果OP知道什么是流,那么OP也知道如何使用回调…>流和生成器函数是你应该寻找的术语。谢谢,我也会在有时间的时候观看该视频。基本上,我试着搜索技术来处理“显示通过节点模块计算的部分数据”和流似乎出现了,但我找不到任何好的例子(大多数处理HTTP请求)。我想更轻松地编写适当的节点模块,这就是我要讨论的内容。顺便说一句:在本次演讲中,我偶然遇到了一个如何使用流计算素数的示例…;-)))…从36:09开始-谢谢你的视频,我最后看了大部分。非常有用!非常感谢你的反馈:-)
$ node index.js 25
[ 2, 3, 5, 7, 11, 13, 17, 19, 23 ]
$ node index.js 10000000
# Takes a while to run before outputting the numbers...
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');
    });
});