Node.js и файловая система: это состояние гонки?

У меня есть следующий код внутри класса. (Это 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 () вернулся немедленно, он помчался и представил следующее имя файла в массиве вызову функции? Или у меня есть какое-то недопонимание относительно устойчивости ценностей в данной области?

6
задан Elf Sternberg 10 July 2011 в 17:03
поделиться