Node.js嵌套回调

时间:2014-05-27 05:17:46

标签: node.js

我在node.js编程中有一个非常基本的问题。 我发现它很有趣,因为我已经开始深入了解它了。

我遇到了以下代码:

Abc.do1(‘operation’,2, function(err,res1) 
{
   If(err) {
        Callback(err);
    }
    def.do2(‘operation2’,function(l) {
   }
  }

我的问题是:

因为 def.do2 是在 abc.do1 的回调中写的,

在abc.do1的'operation'完成并调用回调函数之后执行def.do2是否正确?如果是,这是一个很好的编程实践,因为我们只说node.js中的异步和非阻塞代码

2 个答案:

答案 0 :(得分:1)

是的,你是对的。在abc.do1()完成后执行def.do2()。但是,这样做是为了确保在do2()可以启动之前完成do1()。如果它意味着要并行完成,则do2()将不在do1()的回调之外。此代码并非完全阻止。在do1()启动之后,代码仍然继续执行do1()functon(在do1的回调之外)下面的所有内容,而不是do2(),直到do1()完成为止。

答案 1 :(得分:1)

是的,你是完全正确的,你给出了一个正确的回调函数示例。

主浏览器进程是单线程事件循环。如果在单线程事件循环中执行长时间运行的操作,则该进程会“阻塞”。这很糟糕,因为进程在等待操作完成时停止处理其他事件。 'alert'是为数不多的阻止浏览器方法之一:如果您调用alert('test'),则无法再单击链接,执行Ajax查询或与浏览器UI交互。

为了防止长时间运行的阻塞,XMLHttpRequest提供了一个异步接口。你在操作完成后传递一个回调函数来运行,当它正在处理时,它会控制回主事件循环而不是阻塞。

没有理由使用回调,除非您想要将某些东西绑定到事件处理程序,或者您的操作可能阻塞,因此需要异步编程接口。

观看此视频

http://www.yuiblog.com/blog/2010/08/30/yui-theater-douglas-crockford-crockford-on-javascript-scene-6-loopage-52-min/