У меня есть следующий код внутри класса. (Это coffeescript - и это для утилиты couchdb! - но на самом деле это вопрос node.js). Я пытаюсь делать вещи The Node Way, используя Node 0.49, а это означает использование асинхронных вызовов для операций файловой системы. Сначала я выдергивала волосы из-за этого.sentinel
несколько раз обнулялся в процессе обработки, поэтому я знаю, что делаю здесь что-то не так. Но затем я столкнулся с еще более странной проблемой: внизу в load_directory увидеть те вызовы console.log ()
? Посмотрите, когда это произойдет, когда я запускаю это.
check_sentinel: ->
@sentinel--
if @sentinel == 0
@emit('designDirLoaded', @object)
load_file: (rootdir, filename, object) ->
@sentinel++
fname = path.join(rootdir, filename)
@manifest.push(fname)
fs.readFile fname, (err, data) =>
object[filename] = data
@check_sentinel()
load_directory: (dirpath, object) ->
@sentinel++
fs.readdir dirpath, (err, files) =>
for fname in files
console.log("X1: ", fname)
fs.stat path.join(dirpath, fname), (err, stats) =>
console.log("X2: ", fname)
if stats.isFile()
@load_file(dirpath, fname, object)
if stats.isDirectory()
object[fname] = {}
@load_directory(path.join(dirpath, fname), object[fname])
@check_sentinel()
Вот что я получаю:
X1: memberByName.js
X1: memberByClub.js
X2: memberByClub.js
X2: memberByClub.js
Это нереально, и это выглядит очень похоже на состояние гонки. "memberByName" передается в fs.stat ()
, которая, в свою очередь, передает "memberByClub" в load_file ()
, подразумевая ... что? Это потому, что load_file ()
вернулся немедленно, он помчался и представил следующее имя файла в массиве вызову функции? Или у меня есть какое-то недопонимание относительно устойчивости ценностей в данной области?