2013-07-01 4 views
1

В документации по проверке мандата Mongoose они говорят: «Проверка является асинхронно рекурсивной: при вызове Сохранение модели # выполняется проверка поддокумента. Если произошла ошибка, ваш обратный вызов сохранения модели # "Что такое асинхронно рекурсивное среднее значение в nodejs

Что они подразумевают под этим? Предположим, у меня есть 5 валидаций, чем они будут выполняться параллельно или последовательно? Или они вызываются последовательно с обратным вызовом, полученным методом сохранения модели? Пожалуйста, помогите мне понять это? Я знаю, что это очень простой вопрос. Но я не мог получить никакой помощи от поиска и всех. Так пожалуйста.

+0

Все еще жду кого-то, кто может через больше света узнать о специфике мангуста. –

ответ

1

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

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

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, может быть сложно оборачивать голову, я был там и хотел, чтобы кто-то в то время сказал мне то же самое.

+0

Спасибо за помощь. Просто чтобы прояснить еще одну вещь, означает ли это, что вызов fn1, fn2 и fn3 в асинхронном рекурсивном режиме с обратным вызовом функции, ожидающей завершения всех 3, будет означать, что fn 2 не ждет, пока fn 1 полный и тот же для fn3? Я в основном спрашиваю, чем время, затраченное на выполнение всех функций, будет суммой каждого или максимального времени любого человека? –

+0

Это будет означать, что это сумма каждого из них.Преимущество, которое вы получаете от асинхронной рекурсии, заключается не в том, что индивидуальный запрос происходит быстрее, а в том, что другие события могут происходить в фоновом режиме во время запросов. Например, вы могли бы иметь несколько fn1s, происходящих (obj1.fn1, obj2.fn1, obj3.fn1) могли бы быть все сразу (хотя и не в сингулярных вызовах первой функции примера, рекурсия предотвращает это, но не удерживает вас от вызова dataBaseQuery несколько раз подряд на разных массивах !!!), но у вас никогда не было бы: (obj1.fn1, obj1.fn2), происходящего в одно и то же время. – ChrisCM

+0

Даже если вы попытались сделать это, дважды вызвав dataBaseQuerys в одном массиве. То, что вы в итоге получите, это obj1.fn1 и copyOfObj1.fn2, которые могут выполняться одновременно. Каждый из них находится в разных пределах. – ChrisCM

Смежные вопросы