Q使用connection.insert承诺和mongoose

时间:2013-05-23 06:23:14

标签: mongoose q

我有这段代码:

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

当我执行它时,promise无法解析(并且数据不会被插入);

如果我采用普通承诺的方法,那就有效:

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);

的工作原理。现在我迷路了:))

由于

1 个答案:

答案 0 :(得分: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,正如您所说的那样:{/ 1>

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