2017-05-24 3 views
0

Ich arbeite derzeit mit Mungo und Bluebird als eine instable Promise-Bibliothek. Nach Mungo docs, ich habe folgendes getan:Bluebird's Promise.map() funktioniert nicht mit Mongoose, wenn sie in mongoose.Promise gesteckt wird

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

// Some function making use of Bluebird's Promise.map() 
function someFn() { 
    return Promise.map([ 
     someModel.findById(someId).exec(), 
     someOtherModel.findById(someOtherId).exec() 
    ], mapperFn) 
     .then(function() {}) 
     .catch(function() {}); 
} 

Wie Sie sehen können, ich versuche, drossel zu gebrauchen Promise.map() in meinem Code, aber ich erhalte die folgende Fehlermeldung erhalten:

TypeError: Promise.map is not a function 

Dann ich habe versucht, durch drossel erforderlich und es wird zu einem neuen var Promise, wie dieser

var mongoose = require('mongoose'); 
var Promise = require('bluebird'); 

// Some function making use of Bluebird's Promise.map() 
function someFn() { 
    return Promise.map([ 
     someMode.findById(someId).exec(), 
     someOtherModel.findById(someOtherId).exec() 
    ], mapperFn) 
     .then(function() {}) 
     .catch(function() {}); 
} 

das funktionierte Einstellung, aber scheint nicht der richtige zu sein Möglichkeit, dieses Problem anzugehen. Ich weiß nicht, ob dies Konflikte mit anderen Variablen im Mungo-Code verursachen könnte.

Irgendwelche Vorschläge, damit dies funktioniert?

Antwort

1

Um Promise.map() zu verwenden, müssen Sie Promise als Bluebirds Objekt definieren, nicht nur das reguläre ES6 Promise. Das würde du tun, wie folgt:

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

Oder könnten Sie auch dies nur tun:

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

Wie es war, Sie versuchen Promise.map() mit der regulären ES6 Version von Promise zu tun.


Ihr zweiter Ansatz wurde die Definition richtig Promise Drossel Bibliothek zu sein, und deshalb Promise.map() gearbeitet, aber sie wurden nicht mit Drossel-Versprechen mit Mungo, die wegen der Versprechen Interoperabilität zwischen verschiedenen Arten von Versprechungen so lange in einigen Fällen funktionieren wie Sie nur .then() auf die Versprechen, die aus Mungo und nichts Besonderes wie die Myriaden von Bluebird zusätzliche Methoden zurückkommen.

0

Der Fehler, den Sie erhalten haben, wurde dadurch verursacht, dass mongoose.Promise statt Promise definiert wurde und dann Promise verwendet wurde, eine Variable, die in diesem Bereich nicht existiert.

Der zweite Ansatz scheint nichts innerhalb von mongoose überhaupt zu modifizieren. Aber nur um sicher zu sein, wäre es interessant zu sehen, wie promiseArray definiert ist.

Dann rate ich nicht undefined als Handler für then und catch zu übergeben.

+0

Lassen Sie mich es bearbeiten, um ein genaueres Bild von dem zu zeigen, was ich mache. –

+0

Indem ich "mongoose.Promise" zu "Promise" ändere, wie du es vorgeschlagen hast, habe ich es funktionstüchtig gemacht. Nun, meine Frage ist, wird dies Bluebird auf den Rest von Mungos Versprechen anwenden? Besser gesagt, wird dies die Voreinstellung von Mungoose außer Kraft setzen? –

+0

Gemäß der Mungo-Dokumentation verwendet Mungo Promises/A + -konforme Versprechen. Das bedeutet, dass sie in der Lage sein sollten, mit Bluebird zu interagieren, die auch den Promises/A + -Standard implementieren. Nach Ihrem zweiten Ansatz ändern Sie Mungo in keiner Weise. Jetzt ist es sehr empfehlenswert, wenn Sie mit Bluebird gehen wollen, machen Sie immer noch den 'mongoose.Promise = require ('bluebird')' Schritt. – arboreal84