Ни один из кодов, которые вы показываете, не использует рекурсию. Когда вы вызываете useFile
, он вызывает posix.stat()
, что возвращает, а useFile
завершается, когда он завершается. Через некоторое время, когда вызов posix.stat()
завершится в базовой системе и результаты станут доступны, будет добавлена функция обратного вызова, добавленная для этого. Это вызывает posix.open()
, а затем завершается по мере его завершения. Как только файл был успешно открыт, будет выполнена функция обратного вызова для , которую выполнит, вызвав posix.read()
, и затем прекратит работу, поскольку она также запустилась до завершения. Наконец, когда результаты чтения станут доступны, будет выполнена самая внутренняя функция.
Важным моментом является то, что каждая функция выполняется до конца, так как вызовы функций posix.*()
неблокируют: то есть они возвращаются немедленно, что вызвало запуск некоторой магии в базовой системе. Таким образом, каждая из ваших функций завершается, и позднее событие вызовет выполнение следующей функции; но ни в коем случае нет никакой рекурсии.
Вложенная структура кода может создать впечатление, что материал внутри должен будет закончить, прежде чем материал снаружи сможет достичь своей конечной точки. Но в этом стиле асинхронного программирования, управляемого событиями, имеет больше смысла видеть вложенность в терминах глубже => происходит позже, чем .
РЕДАКТИРОВАТЬ: попробуйте добавить некоторые операторы регистрации непосредственно перед концом каждой вложенной функции; это поможет проиллюстрировать, что порядок, в котором они выполняются, снаружи внутрь.