Как определить порядок выполнения для Node.js?

В настоящее время я пытаюсь проверить код Node.js. Прямо сейчас я пытаюсь выяснить, почему мой код console.log () в другом порядке относительно порядка выполнения кода. Это касается вызовов функций Node.js, связанных с ОС.

Мой скрипт делает это по порядку:

//First
fs.readdir(){ //read from a directory all the available files
   console.log some stuff #a
}

//Second
fs.readFile(){ //read entire text file
   console.log some stuff #b
}

//Third
//create readline interface using fs.createReadStream(filedir) then

interface{ //read from text file line by line
   console.log some stuff #c
}

Функция a использует путь: __dirname + '/ text_file /'
Функция b и c использует путь: __dirname, '/text_file/text1.txt'

Вывод:

a
c
b

Может кто-нибудь объяснить, почему этот заказ происходит? Я не эксперт в операционной системе или что происходит в фоновом режиме с помощью Node.js. Будет ли этот заказ испортить мое приложение, если я буду полагаться на это?

javascript,node.js,asynchronous,fs,synchronous,

-4

Ответов: 4


1 принят

Если вы запускаете несколько асинхронных операций, таких как одно за другим, порядок завершения является неопределенным. Эти операции выполняются независимо от вашего Javascript. Они называются «неблокирующими», что означает, что они немедленно возвращаются из вызова функции и ваш Javascript продолжает выполняться. Некоторое время спустя они заканчивают, вставляют событие в очередь событий Javascript, а затем вызывается обратный вызов, который вы передали ему. Асинхронный, неблокирующий аспект этих функций означает, что они не «ждут» завершения операции перед возвратом.

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

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

Например:

fs.readdir(somePath, function(err, files) {
    if (err) {
        console.log(err);
    } else {
        fs.readFile(someFilename, function(err, data) {
            if (err) {
                console.log(err);
            } else {
                // done with both asynchronous operations here
                console.log(data);
            }
        });
    }
});

Некоторые другие релевантные ссылки на эту тему:

Как разрешить асинхронный метод readFile следовать порядку в node.js

Как синхронизировать последовательность обещаний?

Как установить конкретный порядок выполнения при использовании асинхронных вызовов?

Как выполняется асинхронное выполнение Javascript? и когда не использовать оператор возврата?

Однопоточная синхронная и асинхронная путаница

Почему функции callbacks позволяют нам делать асинхронно в Javascript?


1

fs.readdir(someDir, function(err, files) { if (err) return; // do stuff with the list of files in the directory fs.readFile(someFile, function(err, contents) { if (err) return; // do stuff with the file's contents }); });и readFileявляются асинхронными, то есть они обрабатывают вне основного потока кода. Вот почему вы можете дать им обратный вызов, который выполняется после завершения операции, что может занять много времени (по понятию времени компьютера).

Вы не можете полагаться на выполнение асинхронных функций до выполнения следующей синхронной строки кода. Это означает, что в конечном итоге ваш код будет выглядеть следующим образом:

Promise

Почему асинхронно, спросите вы? Ну, может быть, вы можете заниматься другими вещами, пока (очень медленный) диск вращается вокруг, пытаясь найти ваши данные. Остановка всей программы во время чтения диска будет очень заметной тратой времени, поэтому Node делает такие операции, которые зависят от дискового или сетевого асинхронного режима, что освобождает вас от продолжения любой другой обработки до тех пор, пока они не будут выполнены.

Конечно, это означает, что вам нужно написать код, который зависит от вывода таких асинхронных операций внутри обратного вызова.


В другом примечании:

Надеюсь, вы увидите, что для больших приложений этот стиль кодирования очень громоздкий, так как основной код всегда будет идти вправо, а отслеживание ошибок сложно. Вот почему они Promiseбыли изобретены, и я бы порекомендовал вам их изучить, но после того, как вы понимаете нормальную асинхронность.


1

В отличие от традиционных языков программирования, JavaScript (и его варианты, такие как NodeJS) запускают код параллельно, каждая асинхронная функция выполняется независимо от других, и из-за этого программа не запускается последовательно, это делает выполнение быстрее, но сложнее управлять

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

https://www.sohamkamani.com/blog/2016/03/14/wrapping-your-head-around-async-programming/


0

Все эти функции являются асинхронными и будут выполняться параллельно. fs.readFileобратный вызов будет выполняться после того, как будет прочитан весь файл, так как fs.createReadStreamобратный вызов будет выполняться, когда первый фрагмент потока будет читаемым, а это быстрее, чем первый.

JavaScript, Node.js, асинхронный, фс, синхронный,
Похожие вопросы