2016-04-11 3 views
0

Ich verwende Bluebird und Segel, um meine Anwendung zu erstellen. Wenn ich eine Datenbank-Aufruf innerhalb des Versprechens verwenden, zeigen sie mir die Warnung wieWarnung: Ein Versprechen wurde in einem Handler erstellt, wurde aber nicht zurückgegeben

Warnung: ein Versprechen wurde in einem Handler erstellt wurde aber nicht von es

var P = require('bluebird'); 
return new P(function (resolve, reject) { 
    Product.find({ 
    or: [ 
     {barcode: {'contains': q}}, 
     {name: {'contains': q}}, 
     {registrationCode: {'contains': q}} 
    ] 
    }) 
    .populate('batches') 
    .exec(function (err, products) { 
    if (err) return reject(err); 
    return resolve(products); 
    }); 
}); //- end promise 
+0

Sagt nicht schon Sails Versprechen? Wenn dies der Fall ist, sollten Sie den [Promise-Konstruktor-Antipattern] vermeiden (http://stackoverflow.com/q/23803743/1048572). – Bergi

Antwort

0

//add return 
 
return Product.find({ 
 
... 
 
//wrapping inside bluebird promise wrapper is unnecessary here as well
zurück

... Dies ermöglicht asynchrone Methoden Rückgabewerte wie synchrone Methoden: Anstelle des endgültigen Werts gibt die asynchrone Methode eine Zusage zurück, dass sie irgendwann einen Wert in der Zukunft haben soll.

verweisen auf die documentation, standard

0

Ändern Sie den Code dazu:

return Product.find({ 
    or: [ 
     {barcode: {'contains': q}}, 
     {name: {'contains': q}}, 
     {registrationCode: {'contains': q}} 
    ] 
    }) 
    .populate('batches') 
    .exec().then(function(products) { 
     // your processing here 
    }); 

.exec() bereits erstellt ein Versprechen, so können Sie nur dieses Versprechen zurück, ohne es in einem anderen Versprechen Verpackung.

Die Warnung, die Sie gesehen haben, war, weil Sie nichts mit einem Versprechen getan haben, das in einem vorhandenen Versprechens-Handler erstellt wurde. Ohne mehr Code zu sehen, können wir nicht sicher sagen, ob die Warnung dadurch verursacht wurde, dass Sie das Versprechen, das .exec() zurückgibt, ignorieren oder wenn Sie nichts mit dem Versprechen tun, dass diese Funktion zurückkehrt.

Siehe die Bluebird Erklärung für diese Warnung here. Das macht es wahrscheinlich, dass Sie das Versprechen von .exec() ignoriert haben.

+0

Ich habe einige Verarbeitung in der exec(), und diese Funktion ist ein Dienst, der von anderen Methoden aufgerufen wird. Also sollte ich etwas in der exec tun() – Dzanvu

+0

@Dzanvu - '.exec()' gibt eine Zusage zurück. Wenn Sie Versprechungen verwenden, können Sie die Verarbeitung in einem '.then()' -Handler durchführen, der zu dem Versprechen hinzugefügt wird, das von '.exec()' zurückgegeben wird. Ich habe dem Code in meiner Antwort ein Beispiel hinzugefügt. – jfriend00

+0

Sie meinen, dass, wenn diese Funktion 'AService.f' genannt wird, und '// Ihre Verarbeitung hier' durch' return {a: 1, b: 2} 'ersetzt wird, kann ich das Objekt von' {a: 1 , b: 2} 'in einer anderen Modellaktion namens 'AController.g' über' AService.f (paramsPassed) .then (Funktion (obj) {console.log (obj);}) '? Als Ergebnis kann die Datei console.log "{a: 1, b: 2}" ausgeben – Dzanvu