【问题标题】:Don't understand the callback and non-blocking example - Node.js不懂回调和非阻塞的例子——Node.js
【发布时间】:2016-08-05 04:34:42
【问题描述】:

在Hands-on node一书中,作者给出了阻塞I\O的例子,

var post = db.query("select * from posts where id = 1");
doSomethingWithPost(post)
doSomethingElse();

作者说在第 1 行执行完 db 查询之前什么都不执行

然后,他显示非阻塞代码

callback = function(post){
doSomethingWithPost(post)
}

db.query("select * from posts where id = 1",callback);
doSomethingElse();

在查询执行之前,这不是也阻塞了吗?

所以,doSomethingElse 在查询完成之前不会被执行。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    您应该始终将诸如doRealStuff( params, callback ) 之类的非阻塞函数读为“将doRealStuff、参数和回调放入队列,当到达队列末尾时执行回调()”。这也可能有助于避免犯类似的错误

    for (var i=0; i < 1000000; i++)
    {
        // I want to do many http requests now
        do_request(test_url);
    }
    
    // not a single byte is sent here because event loop was blocked by for loop
    

    【讨论】:

    • Nodebeginner 中也有很好的异步解释短语:“在节点中,除了你的代码之外,一切都是并行运行的”-nodebeginner.org/index.html
    【解决方案2】:

    作者完全正确。如果第二个示例是非阻塞的,则代码执行将触发查询,然后继续执行其余代码。回调函数将在查询完成后调用,在未来某个未确定的时间点。 doSomethingElse(); 将立即被调用。

    在您提供的示例中,究竟是什么让这个示例阻塞与非阻塞并不清楚。这将是数据库实现的内部内容。也许通过传入一个回调参数,您表明请求应该是非阻塞的。

    希望对您有所帮助, 泰勒。

    【讨论】:

    • 我还是不明白..say if query(String, Callback) { //implementaion for retreiving records for the the given query string ...make take time to execute...On basis of resuts fetched call the callback} 。对我来说,这也是阻塞的..除非查询数据库,否则回调将不会执行..会等待..对!!
    【解决方案3】:

    Ryan Dahl's intro 是一个很好的概述,但this beginner's tutorial is excellent,它以友好的方式详细解释了 Javascript(以及 Node)中非/阻塞操作的前提。

    但简而言之,您发布的第二个示例中的回调参数在 db.query 完成之前不会执行,它是“稍后保留”,这意味着 db.query() 调用之后的代码可以继续执行。

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 2023-04-05
      • 2012-08-17
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2016-07-06
      相关资源
      最近更新 更多