2015-06-05 9 views
7

Mam schematu mangusta i wzywam Model.create().Dlaczego nie mogę łańcucha .catch podczas wywoływania mongoose Model.create w węźle

Kiedy łańcuch "catch" po "wtedy" otrzymuję undefined nie jest funkcją, jeśli po prostu wywołuję funkcję błędu jako drugi parametr "wtedy", to nie.

Ale kiedy wzywam metody takie jak Model.find, mogę użyć "catch".

Dlaczego nie mogę złapać '' łańcuch Dzwoniąc Model.create

var mySchema = Mongoose.Schema({ 
    name: String, 
}); 

Works:

KarmaModel.create({ 
      "name": "ss, 
     }) 
     .then(function() { 
      //do somthing 
     },function()=>{ 
      //do somthing 
     }); 

nie działa:

KarmaModel.create({ 
      "name": "ss, 
     }) 
     .then(function() { 
      //do somthing 
     }).catch(function()=>{ 
      //do somthing 
     }); 
+0

Ponieważ ich obietnice nie mogą być zgodne z [specyfikacją A +] (https://promisesaplus.com/). Oznacza to, że zakładając, że '.catch' jest w specyfikacji. [Obietnica mangi] (https://github.com/aheckmann/mpromise) README mówi, że jest zgodny ze specyfikacją ... – Chev

+0

Tak czy inaczej, [źródło] (https://github.com/aheckmann/mpromise/ blob/master/lib/promise.js) zdecydowanie nie ma '.catch': / – Chev

Odpowiedz

8

Po przejściu nad nim, to wygląda na to, że .catch nie jest częścią specyfikacji Promises/A+. Większość bibliotek po prostu wydaje się implementować je jako cukier syntaktyczny. MPromise library jest obiecującą biblioteką dla Mongoose i wygląda na to, że spełnia minimalne wymagania specyfikacji. Możesz spróbować użyć innej obiecującej biblioteki do zawarcia obietnic Mongoose, ale łatwiej będzie po prostu wsiąknąć i trzymać się standardowej rękojeści .then(success, error).

Jeśli chcesz je owinąć, można to zrobić tak:

var Promise = require('bluebird'); 
Promise.resolve(KarmaModel.create({ "name": "ss" }) 
    .then(function() { 
    // do something 
    }) 
    .catch(function() { 
    // do something 
    }); 

Bluebird jest moim ulubionym wdrożenie, ale niemal wszystkie popularne biblioteki obietnica ma tę zdolność.

11

Jak określono na http://mongoosejs.com/docs/promises.html

nowego w Mongoose 4.1.0 Podczas mpromise jest wystarczająca do podstawowych przypadków użycia, zaawansowani użytkownicy mogą chcieć podłączyć w swoim ulubionym stylu obiecuje ES6 biblioteki jak Bluebird, lub po prostu użyć natywne obietnice ES6. Po prostu ustaw mongoose.Promise do swojego ulubionego konstruktora obietnicy w stylu ES6 i użyje go mangusta.

Można ustawić mongoose używać Bluebird przy użyciu:

require("mongoose").Promise = require("bluebird"); 
6

w pewnym momencie mpromise Wydaje się, że dodano wsparcie dla .catch(). Używam [email protected] i .catch() działa poprawnie zgodnie z oczekiwaniami.