Я пытаюсь понять 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
Так вот что я делаю из него:
- Глобальный охват: "Global Start"
- Вызов fs.open с функцией обратного вызова, которая запускается на выполнение, когда fs.open готово.
fs.open начинает работать, и вместо того, чтобы ждать результата, выполняется следующая задача на глобальном уровне, которая является «Global End».
Теперь выполняется fs.open и вызывается функция обратного вызова. Мы вводим глобальную область +1.
Global + 1 область применения: "Global + 1 Start"
Вызов fs.ftruncate с функцией обратного вызова, которая запускается на выполнение, когда fs.ftruncate делается
fs.ftruncate начинает работать, и в то время как он работает, выполняется оставшийся код в области Global + 1, который является «Global + 1 End».
Когда выполняется fs.ftruncate, вызывается функция обратного вызова.
Global + 3 и Global + 4 следуют одному и тому же образцу.
Так что мои вопросы;
Является ли мое описание того, что происходит в коде правильно?
Мне кажется, что асинхронный код выполняется из самой внешней скобки (глобальной области) до самой внутренней скобки (область Global + 4). Это не от самого внутреннего к внешнему кронштейну (как в математике), а не от линии верхушки (например, синхронный код). Это верно?
Что происходит, если функция Global Scope выполнена и выполняет свою функцию обратного вызова до того, как будет выполнен другой код в Global Scope. Будет ли обратный вызов ждать завершения глобального кода?
Будут ли результаты вывода поступать в другом порядке, если один и тот же код выполняется с разными файлами для обработки, которые обрабатываются разным образом?
Ваше описание в основном правильное, за исключением того, что я предлагаю забыть о скобках и погоде, что-то выполняется самым внутренним или внешним. То, что вам не хватает в описании, - это ** время **. Асинхронные обратные вызовы выполняются только через ** ** время **. Для меня лучший способ подумать о них - это инструкции, которые вы указываете записывающему видео (или PVR): запись в «более позднее время», а затем продолжить свою текущую функцию (чтобы показать мне, что на ТВ) – slebetman