我有这段代码:
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);
的工作原理。现在我迷路了:))
由于
答案 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);