Node.js中的执行顺序

时间:2015-03-25 21:19:08

标签: node.js

我一直在努力学习node.js,但我无法理解的一件事就是执行此代码的顺序:

var zlib = require("zlib");
var input = '.............text...............';
zlib.deflate(input, function(err, buffer) {
  if (!err) {
    console.log("deflate (%s): ", buffer.length, buffer.toString('base64'));
    zlib.inflate(buffer, function(err, buffer) {
      if (!err) {
        console.log("inflate (%s): ", buffer.length, buffer.toString());
      }
    });
    zlib.unzip(buffer, function(err, buffer) {
      if (!err) {
        console.log("unzip deflate (%s): ", buffer.length, buffer.toString());
      }
    });
  }
});

zlib.deflateRaw(input, function(err, buffer) {
  if (!err) {
    console.log("deflateRaw (%s): ", buffer.length, buffer.toString('base64'));
    zlib.inflateRaw(buffer, function(err, buffer) {
      if (!err) {
        console.log("inflateRaw (%s): ", buffer.length, buffer.toString());
      }
    });
  }
});

输出:

deflate (18):  eJzT00MCJakVJXqoAABxWgbO
deflateRaw (12):  09NDAiWpFSV6qAAA
inflate (32):  .............text...............
unzip deflate (32):  .............text...............
inflateRaw (32):  .............text...............

怎么来" deflateRaw"在"膨胀"之前输出?我知道node.js可以异步运行,但任何人都可以解释为什么这段代码是异步的,以及如何确定执行的顺序?

2 个答案:

答案 0 :(得分:0)

嗯,这是异步的:)

只要将回调函数传递给一段异步代码,就不知道它将执行哪个顺序。

您可以按照以下方式考虑您的代码顺序:

Flow1:
start deflate with cb1;
start deflateRaw with cb2;
done, the order of starting was guaranteed but not the oder of callbacks execution

Flow2: either cb1 or cb2 starts to get executed

等...

答案 1 :(得分:0)

  
    

我知道node.js可以异步运行,但有人可以解释为什么这段代码是异步的吗?

  

为什么zlib库是异步的,我不能肯定地说。它可以使用I / O的中间文件,我们知道I / O(通常,最好)在node.js中是异步的。它也可以在幕后使用工作进程或其他一些异步机制。

异步代码需要回调,承诺,流或其他类型的控制流模式。

但是,你可以使用带有同步代码的回调,所以你应该问你怎么知道。

我认为最好的建议是假设它需要回调才是异步的。要处理这种情况,要在异步函数A之后运行的代码应该进入回调,无论是同步还是异步。那样,你知道它会起作用。 API开发人员出于某种原因设计了它,因此不要试图通过利用可能同步的东西来对抗他们的设计。顺其自然:)

这是安全的原因是:

  1. 编写图书馆的开发人员出于某种原因设计了这种方式 - 相信他们知道自己在做什么,并且不担心他们为什么这样做的细节。
  2. next 代码行放入回调中是安全的,无论是同步还是异步,但将它放在下一行只对同步代码是安全的。一个保证工作,一个不保证。选择安全的方法。