Natknąłem się na fragment kodu Mongoose, który zawierał zapytanie findOne, a następnie funkcję exec ().
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
źródło
Natknąłem się na fragment kodu Mongoose, który zawierał zapytanie findOne, a następnie funkcję exec ().
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
Zasadniczo podczas korzystania z mangusty dokumenty można odzyskać za pomocą pomocników. Każda metoda modelowa, która akceptuje warunki zapytania, może być wykonana za pomocą metody callback
lub exec
.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Dlatego jeśli nie przekazujesz wywołania zwrotnego, możesz zbudować zapytanie i ostatecznie je wykonać.
Możesz znaleźć dodatkowe informacje w dokumentach mangusty .
AKTUALIZACJA
Podczas używania Promises w połączeniu z operacjami asynchronicznymi Mongoose należy zwrócić uwagę na to, że zapytania Mongoose nie są Promises. Zapytania zwracają thenable , ale jeśli potrzebujesz prawdziwej obietnicy, powinieneś użyć tej exec
metody. Więcej informacji można znaleźć tutaj .
Podczas aktualizacji zauważyłem, że nie odpowiedziałem wprost na pytanie:
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
Cóż, nie jest to natywna metoda JavaScript, ale część interfejsu API Mongoose.
exec
metodę. Tak przynajmniej robią w dokumentach. Aby mieć pewność, że możesz się sprawdzićModel.find() instanceof require('bluebird')
. Mam nadzieję że to pomoże.Model.update().exec()
się upewnić, że się wykona. Następnie możesz odpowiedzieć na interfejs API bez czekania na aktualizację.Daniel odpowiedział na to całkiem pięknie. Aby rozwinąć wyczerpującą listę sposobów tworzenia i wykonywania zapytań, spójrz na następujące przypadki użycia:
Tworzenie zapytań
Mongoose nie wykona zapytanie do czasu
then
lubexec
została wezwana niego. Jest to bardzo przydatne podczas tworzenia złożonych zapytań. Niektóre przykłady mogą obejmować użycie funkcjipopulate
iaggregate
.Wykonanie przez callback
Chociaż wielu nie lubi ich ze względu na zagnieżdżanie, zapytania mogą być wykonywane przez dostarczenie opcjonalnego wywołania zwrotnego.
Następnie API jako obietnice / A +
Zapytania Mongoose zapewniają
then
funkcję. Nie należy tego mylić z regularnymi obietnicami. Mówiąc najprościej, specyfikacja Promises / A + wymaga,then
aby funkcja działała podobnie jak przyzwyczajeni do obietnic.Funkcja exec
Z dokumentów Mongoose
If you need a fully-fledged promise, use the .exec() function.
źródło
then
w zapytaniu, aby zwrócić również obietnicę. To niewiele różni się odexec
. Przypadek użycia, który uważam za przydatny, to użycie czegoś takiegoPromise.all
. Nie jestem jednak pewien, czy obietnica zwrócona przezexec
prace w takich kontekstach.exec()
zwróci obietnicę, jeśli nie zostanie udzielone oddzwonienie. Więc następujący wzorzec jest bardzo wygodny i ogólny - może ładnie obsługiwać wywołania zwrotne lub obietnice:Polecam używanie obietnic Bluebird z Mongoose, w tym celu użyj tego wywołania:
źródło