我一直在努力学习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可以异步运行,但任何人都可以解释为什么这段代码是异步的,以及如何确定执行的顺序?
答案 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开发人员出于某种原因设计了它,因此不要试图通过利用可能同步的东西来对抗他们的设计。顺其自然:)
这是安全的原因是: