Это означает, что, несмотря на то, что у вас есть несколько событий, запускающих «одновременно», каждый метод поддерживает свое собственное состояние, и это собственные шаги обработки ошибок отдельно для каждого запроса и для каждого шага.
Рассмотрите этот пример, в котором нам нужна информация о диске для инициализации запроса к базе данных. Каждый последующий шаг представляет собой асинхронную операцию, которая вызывает обратный вызов.
function dataBaseQuerys(someQuerys) {
function queryDatabase(someQuery) {
if(someQuery === undefined) return;
fs.readFile('someFile', function (err, data) {
'use strict';
var myQuery = someQuery + data;
query(myQuery, function (err, qData) {
doSomethingWithTheQuery(qData);
queryDatabase(someQuerys.pop());//Recursion(behaves iteratively, but with async calls! No for loop necessary)
});
});
}
queryDatabase(someQuerys.pop());
}
Теперь рассмотрим следующий пример, в котором мы не используем асинхронную рекурсию.
function dataBaseQuerys(someQuerys) {
for(var i = 0; i < someQuerys.size; i++) {
var fileData = fs.readFileSync('someFile');
var myQuery = someQuerys[i] + fileData;
doSomethingWithTheQuery(querySync(myQuery));//Finding a DB module that does a "querySync" is probably not possible, but assume it is.
}
}
Эти два примера делают то же самое. Итеративный немного сложнее получить правильную обработку ошибок, а попытка/уловка в javascript плоха, потому что она запрещает оптимизацию. Рекурсивный, синтаксис немного сложнее получить данные о закрытии для объекта nextQuery и т. Д., Но он не засоряет цикл событий, который бесценен для производительности. Все разработчики говорят вам, что они использовали первый пример.
EDIT: Я буду держать руку немного здесь и ответить на ваши пункты маркированного как они относятся к этим примерам:
Что они подразумевают под этим? Честно говоря, здесь не может быть более конкретного ... мой пример явно описывает идиому, которую они используют.
Предположим, у меня есть 5 утверждений, чем они будут выполняться параллельно или последовательно? -Они будут запускаться последовательно, асинхронно. Это точка «рекурсии». Каждой точке кода гарантированно работать в порядке, но в фоновом режиме могут происходить другие вещи, а не вещи, связанные с любой из последовательностей обратного вызова, которые выполняют запросы.
Или они вызываются последовательно с обратным вызовом, который получен методом сохранения модели? -YES
Пожалуйста, помогите мне понять это? - Если это не поможет, вам нужно задать более конкретный вопрос. Кроме того, если вы не видите, как логика, изложенная в моих примерах, охватывает все эти вопросы, вы должны потратить немного больше времени, обернув голову асинхронными «обратными вызовами, основанными на событиях». Если вы привыкли к логическому потоку в стиле C, может быть сложно оборачивать голову, я был там и хотел, чтобы кто-то в то время сказал мне то же самое.
Все еще жду кого-то, кто может через больше света узнать о специфике мангуста. –