2016-04-11 53 views
0

Uygulamamı oluşturmak için bluebird ve yelkenleri kullanıyorum. Ben sözünü içinde bir veritabanı çağrısı kullandığınızda, banaUyarı: Bir işleyicide bir söz oluşturuldu ancak bu dosyadan iade edilmedi

Uyarı gibi uyarı göstermek: bir söz bir işleyici oluşturulmuş ancak o

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

Yelkenler şimdiden söz vermiyor mu? Eğer öyleyse, ['Promise' constructor antipattern] 'den kaçınmalısınız (http://stackoverflow.com/q/23803743/1048572). – Bergi

cevap

0

//add return 
 
return Product.find({ 
 
... 
 
//wrapping inside bluebird promise wrapper is unnecessary here as well
döndü değildi

... Bu asenkron yöntemler sağlar eşzamanlı yöntemler gibi değerler döndürür: son değer yerine, eşzamansız yöntem gelecekteki bir noktada bir değere sahip olma vaadini döndürür.

documentation bakın, buna standard

0

Değişim kodunuzu: sadece başka vaadi sararak olmadan bu sözü geri dönebilmek

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

.exec() zaten bir söz yaratır.

Gördüğünüz uyarı, varolan bir vaat işleyicisinin içinde oluşturulan bir sözle hiçbir şey yapmadığınızdan kaynaklanıyordu. Daha fazla kod görmeden, uyarının, .exec()'un döndürdüğü ya da bu işlevin döndürdüğü sözüyle hiçbir şey yapmadığınız sözünü dikkate almadığınızdan dolayı uyarının size neden olup olmadığından emin olamayız.

Bu uyarı için Bluebird açıklamasına bakın here. Bu, sorunun, .exec() tarafından döndürülen sözleri göz ardı ettiğidir.

+0

exec() işleminde bazı işlemlerim var ve bu işlev diğer yöntemlerle çağrılacak bir hizmettir. Bu yüzden exec() – Dzanvu

+0

@ Dzanvu - '.exec()' de bir şey yapmalıyım. Sözleri kullanıyorsanız, '.exec()' işlevinden döndürülen sözlüğe eklenmiş olan bir '.then()' işleyicide işleme yapabilirsiniz. Cevabımdaki kodun bir örneğini ekledim. – jfriend00

+0

Yani, bu fonksiyon 'AService.f' olarak adlandırılırsa ve '// burada işleminiz' yerine {return: a: 1, b: 2} ile değiştirilirse, {a: 1 nesnesini alabilirim. , b: 2} '' AService.f (paramsPassed) .then (function (obj) {console.log (obj);}) 'aracılığıyla AController.g' adlı başka bir model eylemde? Sonuç olarak, console.log '{a: 1, b: 2}' yazdırabilir – Dzanvu