2016-04-04 4 views
2

Я пытаюсь понять 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 

Так вот что я делаю из него:


  1. Глобальный охват: "Global Start"
  2. Вызов fs.open с функцией обратного вызова, которая запускается на выполнение, когда fs.open готово.
  3. fs.open начинает работать, и вместо того, чтобы ждать результата, выполняется следующая задача на глобальном уровне, которая является «Global End».

  4. Теперь выполняется fs.open и вызывается функция обратного вызова. Мы вводим глобальную область +1.

  5. Global + 1 область применения: "Global + 1 Start"

  6. Вызов fs.ftruncate с функцией обратного вызова, которая запускается на выполнение, когда fs.ftruncate делается

  7. fs.ftruncate начинает работать, и в то время как он работает, выполняется оставшийся код в области Global + 1, который является «Global + 1 End».

  8. Когда выполняется fs.ftruncate, вызывается функция обратного вызова.

Global + 3 и Global + 4 следуют одному и тому же образцу.


Так что мои вопросы;

Является ли мое описание того, что происходит в коде правильно?

Мне кажется, что асинхронный код выполняется из самой внешней скобки (глобальной области) до самой внутренней скобки (область Global + 4). Это не от самого внутреннего к внешнему кронштейну (как в математике), а не от линии верхушки (например, синхронный код). Это верно?

Что происходит, если функция Global Scope выполнена и выполняет свою функцию обратного вызова до того, как будет выполнен другой код в Global Scope. Будет ли обратный вызов ждать завершения глобального кода?

Будут ли результаты вывода поступать в другом порядке, если один и тот же код выполняется с разными файлами для обработки, которые обрабатываются разным образом?

+1

Ваше описание в основном правильное, за исключением того, что я предлагаю забыть о скобках и погоде, что-то выполняется самым внутренним или внешним. То, что вам не хватает в описании, - это ** время **. Асинхронные обратные вызовы выполняются только через ** ** время **. Для меня лучший способ подумать о них - это инструкции, которые вы указываете записывающему видео (или PVR): запись в «более позднее время», а затем продолжить свою текущую функцию (чтобы показать мне, что на ТВ) – slebetman

ответ

2

У вас есть довольно хорошее понимание этого.Что касается ваших вопросов:

  1. «Мне кажется, как асинхронный код выполняется из наиболее внешнего фиксатора (глобальная область) до самого внутренней скобки»

асинхронного вызов будет выполнять, как и любые другую команду, но вместо того, чтобы ждать результатов, следующая команда ниже этого будет выполнена. Следующая команда - это прямая строка после асинхронного обратного вызова, если нет вызова функции какого-либо рода.

  1. «Будет ли обратный вызов ждать завершения глобального кода?»

Глобальные переменные области не будут ждать асинхронного вызова и наоборот. Код будет запущен, а некоторый код позже, который опирается на переменные внутри асинхронного вызова, может получить или не получить обновленные версии этих переменных. Это зависит от того, завершился ли асинхронный вызов вовремя или нет.

  1. «Получены ли результаты вывода в другом порядке, если один и тот же код выполняется с разными файлами для обработки, которые обрабатываются разным образом?»

Опять же, порядок выполнения кода зависит от скорости асинхронного вызова. Код всегда будет читаться в том же порядке. Чтобы предотвратить избиение вашего асинхронного вызова, вы должны убедиться, что все ваши JS, которые полагаются на асинхронный вызов, входят в обратный вызов, потому что он будет ждать до завершения асинхронизации.

Я считаю, что я ответил на все ваши вопросы, кто-нибудь комментирует, если я что-то упускаю.

Смежные вопросы