1

我有这段代码:

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;

我究竟做错了什么?

ps看起来像

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

作品。现在我迷路了:)

谢谢

4

1 回答 1

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);
于 2013-05-23T23:46:06.280 回答