如何编写非阻塞模块

How do you write non-blocking modules?

本文关键字:模块 何编写      更新时间:2023-09-26

来自一个完全不同的背景,Node.js的工作方式对我来说仍然是一个非常陌生的概念。我正在掌握在函数中使用回调的概念,但当我试图支持模块化开发并因此实现更好的扩展时,我很难将其付诸实践。

例如,我如何将函数的结果返回到我的代码中,或者更确切地说,在不阻塞的情况下访问?我一直在读这篇文章,但我无法理解这是如何实现的,因为每个人都在给我一个不同的答案。以日志函数为例:

exports.log = function (req, res, type) {
    // do stuff here
}

提前谢谢。

function doStuff (someValue, someOtherValue, someCallBack) {
    console.log("First Value: " + someValue);
    while(someValue-- != 0) {console.log(someValue);}
    someCallBack(someOtherValue);
}
function delayEventLoopMore(someValue) {
    while(someValue-- != 0) {console.log('The value:' + someValue);}
}
doStuff(100000, 100000, delayEventLoopMore);
console.log('YAY!');

前面的代码是一个涉及回调的阻塞代码示例。显然,简单地提供回调参数并不能使此代码成为非阻塞代码。如果你运行它,你应该清楚地看到从100000到0的两个不同的计数,然后最后打印"YAY"。如果这个功能是非阻塞的,我们肯定会有足够的时间打印"Yay"。如果你对此表示怀疑,可以随意将价值提高到数百万甚至数十亿。"耶"永远是最后印出来的。

真正的异步、非阻塞行为来自V8后端。复制这一点的唯一方法是生成一个本机扩展。

以下是该功能的两个版本:

exports.log = function (someFileName) {
    var results;
    results = fs.readFileSync(someFileName);
    return results;
}

exports.log = function (someFileName, callback) {
    var results;

    fs.readFile(someFileName, function(data) {
        results = data;//unnecessary just for clarity!
        callback(results);
    }
}

第一个版本假设您正在执行的任何操作都是同步的。在这种情况下使用回调绝对没有任何好处。只需返回结果即可。无论哪种方式,它都将导致事件循环中完全相同的延迟量。如果你在这里必须做的工作是非常耗费CPU的,那么你可能会陷入这种困境。

如果是I/O密集型,您可以执行以下两项操作之一。A: 利用已经开发的异步节点模块:http,fs,有一些好的mongodb东西,等等…或者,如果你的用例不存在任何东西,就为它开发一个本地扩展。无论如何,返回结果的方式是,通过回调用户提供给你的,并使用您在异步操作过程中建立的"results"的内容调用此回调。