2013-05-23 3 views
1

у меня есть этот кусок кода:Q обещания и мангуст с connection.insert

var RidePaths = mongoose.model('ridepaths', ridePathSchema); 
return q.nfcall(RidePaths.collection.insert, ridePaths); 

и когда я выполнить это обещание не разрешится (и данные не вставляются);

Если я делаю простое обещание подхода работает:

var d = q.defer(); 
RidePaths.collection.insert(ridePaths, function(error) { 
    console.log(error); 
    d.resolve(true); 
}); 
return d.promise; 

Что я делаю неправильно?

p.s выглядит как

q.ninvoke(RidePaths.collection, 'insert', ridePaths); 

работы. Теперь я потерял :)

Благодарности

ответ

3

Это довольно распространенная проблема, на самом деле не делать с Q, но делать с JavaScript в целом. Проблема в том, что когда вы передаете функции другим функциям, они теряют свой контекст this. У вас была бы такая же проблема, если бы вы это сделали, например.

var func = RidePaths.collection.insert; 
func(...); // does not work 

Решение использовать .bind:

var func = RidePaths.collection.insert.bind(RidePaths.collection); 
func(...); // works! 

То же самое работает в Q, где вы передаете RidePaths.collection.insert как функция:

return q.nfcall(RidePaths.collection.insert.bind(RidePaths.collection), ridePaths); 

Это, конечно, многословным и уродливые, поэтому мы предоставили вам ninvoke, который, как вы отметили, прекрасно работает:

return q.ninvoke(RidePaths.collection, 'insert', ridePaths); 
+0

Большое вам спасибо! Я думаю, что это должно быть частью введения Q! – nicco82

+0

@ nicco82 добавлен как https://github.com/kriskowal/q/commit/ccaae9f4a88bb64c41609ec78922b587e56d2caf, см. Выход на https://github.com/kriskowal/q#adapting-node – Domenic