Мангуст-что делает функция exec?


я наткнулся на кусок кода мангуста, который включал запрос findOne, а затем функцию exec ().

Я никогда не видел этот метод в JavaScript раньше? Что именно он делает?

3   51   2015-07-22 00:22:45

3 ответа:

в основном при использовании Мангуст, документы могут быть получены с помощью помощников. Каждый метод модели, который принимает условия запроса, может быть выполнен с помощью callback или exec метод.

callback:

User.findOne({ name: 'daniel' }, function (err, user) {
  //
});

exec:

User
  .findOne({ name: 'daniel' })
  .exec(function (err, user) {
      //
  });

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

вы можете найти дополнительную информацию в Мангуст документы.

обновление

что-то отметить при использовании обещания в сочетании с Мангуст асинхронных операций является то, что Мангуст запросы не обещания. Запросы возвратить thenable, но если вам нужно реальные обещайте, что вы должны использовать exec метод. Более подробную информацию можно найти здесь.

во время обновления я заметил, что не ответил явно вопрос:

Я никогда не видел этот метод в JavaScript раньше? Что он делает точно?

Ну это не собственный метод JavaScript, но часть API Мангуста.

Даниэль ответил на это довольно красиво. Чтобы получить исчерпывающий список способов построения и выполнения запросов, рассмотрим следующие варианты использования:

Построения Запросов

Мангуст не будет выполнять запрос, пока then или exec был призван на него. Это очень полезно при построении сложных запросов. Некоторые примеры могут включать в себя использование populate и aggregate функции.

User.find({name: 'John'}) // Will not execute

казнь через обратный вызов

хотя это не нравится многим из-за его вложенности, запросы могут выполняться путем предоставления дополнительного обратного вызова.

User.find({name: 'John'}, (err, res) => {}) // Will execute

тогда API как обещания/A+

Мангуст запросы предоставляют

exec() возвращает обещание, если обратный вызов не предоставила. Таким образом, следующий шаблон очень удобен и универсален - он может обрабатывать обратные вызовы или обещания красиво:

function findAll(query, populate, cb) {

  let q = Response.find(query);

  if (populate && populate.length > 0) {
    q = q.populate(populate);
  }

  // cb is optional, will return promise if cb == null
  return q.lean().exec(cb);

}

Я рекомендую использовать Bluebird обещания с Мангустом, чтобы сделать это, используйте этот вызов:

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');