1

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

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

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

提前致谢。

4

1 回答 1

3
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!');

前面的代码是一个涉及回调的阻塞代码示例。显然,简单地提供回调参数并没有使这段代码成为非阻塞的。如果你运行它,你应该清楚地看到从 100,000 到 0 的两个不同的计数,然后最后打印“YAY”。如果这个函数是非阻塞的,我们肯定会有足够的时间来打印'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 东西,等等......或者如果您的用例不存在,请为其开发本机扩展。无论如何,您返回结果的方式是获取用户提供给您的回调,并使用您在异步操作过程中建立的“结果”内容调用此回调。

于 2013-07-24T20:06:19.200 回答