我想了解的异步代码的conept,让我产生了以下代码:的JavaScript:异步函数
"use strict";
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Global Start");
console.log("+++ Async open - truncate - close: open file2 called");
fs.open("file2.txt", "r+", function (err, fd) {
console.log(" Global + 1 Start");
if (err) {
return console.error(err);
}
console.log(" +++ Async file2 opened successfully!");
// Truncate the opened file.
console.log(" +++ Async open - truncate - close: truncate file2 called");
fs.ftruncate(fd, 10, function (err) {
console.log(" Global + 2 Start");
if (err) {
console.log(err);
}
console.log(" +++ truncate file2 successfully!");
console.log(" +++ Async open - truncate - close: read file2 called");
fs.read(fd, buf, 0, buf.length, 0, function (err, bytes) {
console.log(" Global + 3 Start");
if (err) {
console.log(err);
}
// Print only read bytes to avoid junk.
if (bytes > 0) {
console.log(" Global + 3 +++ truncate read: '" + buf.slice(0, bytes).toString() + "'");
}
// Close the opened file.
console.log(" Global + 3 +++ truncate - open - close: close file2 called");
fs.close(fd, function (err) {
console.log(" Global + 4 Start");
if (err) {
console.log(err);
}
console.log(" Global + 4 ++++++++++++++++++++ Async open - truncate - close file2 + closed ++++++++++++++++++++");
console.log(" Global + 4 End");
});
console.log(" Global + 3 End");
});
console.log(" Global + 2 End");
});
console.log(" Global + 1 End");
});
console.log("Global End");
从而创立了下面的输出。
Global Start
+++ Async open - truncate - close: open file2 called
Global End
Global + 1 Start
+++ Async file2 opened successfully!
+++ Async open - truncate - close: truncate file2 called
Global + 1 End
Global + 2 Start
+++ truncate file2 successfully!
+++ Async open - truncate - close: read file2 called
Global + 2 End
Global + 3 Start
Global + 3 +++ truncate read: 'This is a '
Global + 3 +++ truncate - open - close: close file2 called
Global + 3 End
Global + 4 Start
Global + 4 ++++++++++++++++++++ Async open - truncate - close file2 + closed ++++++++++++++++++++
Global + 4 End
所以这是我做的是:
- 全球范围有: “全球开始”
- 调用具有一个回调函数fs.open fs.open时被执行已经完成了。
fs.open开始工作,而不是等待结果,而是执行全局级别的下一个任务,即“全局结束”。
现在完成fs.open并调用回调函数。我们输入全球+1范围。
全球+ 1范围: “全球+ 1开始” 有一个回调函数
呼叫fs.ftruncate时fs.ftruncate完成
fs.ftruncate开始工作那得到执行,当它工作时,Global + 1范围的其余代码被执行,即“Global + 1 End”。
当fs.ftruncate完成时,它的回调函数被调用。
Global + 3和Global + 4遵循相同的模式。
所以我的问题是;
是我对代码中发生的事情的描述是否正确?
在我看来像异步代码是从最外层的括号(全局范围)执行到最内层的括号(全局+4范围)。它不是从最内层到外层(像数学一样),也不是从顶层到顶层(如同步代码)。那是对的吗?
如果全局作用域上的某个函数完成并在全局作用域上的其他代码完成之前执行其回调函数,会发生什么情况。回调是否等待全局代码完成?
如果使用不同的文件执行相同的代码以处理需要不同时间处理的输出,那么输出的结果会以不同的顺序出现吗?
你的描述基本上是正确的,但我建议忘记括号和天气的东西是执行最内层或最外层。你在描述中缺少的东西是** time **。异步回调仅在稍后的**时间执行**。对我而言,最好的方式就是像告诉视频(或PVR)录像机的说明一样:在“稍后”录制,然后继续当前的功能(这是为了向我展示电视上的内容) – slebetman