使用带有promises而不是回调的node.js,通过指定用户id从mongo中检索用户对象。 Db访问使用require('mongodb').Db
来电从以下代码的底部开始:findByIdPromise(userId)
collection.findOne()
需要userId作为参数,但then()
调用一个函数,其中promise作为单个参数。
为了解决这个限制,我传递then()
一个对象finder
,它具有userId属性预设,以及一个函数findUser
,它接受集合的承诺,并调用集合的findOne
,将预设的userId传递给它
这是一个不太合适的方式吗?
UserProvider.prototype.getCollectionPromise = function () {
var deferred = q.defer();
var resolve = deferred.resolve;
var collectionCallback = function (error, usersCollection) {
if (error) {
throw new Error(error);
} else {
resolve(usersCollection);
}
};
this.db.collection(CollectionName, collectionCallback);
return deferred.promise;
};
UserProvider.prototype.findOnePromise = function () {
var userId;
var setUserId = function (id) { this.userId = id; };
var deferred = q.defer();
var resolve = deferred.resolve;
var findUser = function (coll) {
coll.findOne(
{ _id: id },
function(error, result) {
if (error) {
throw new Error(error);
} else {
resolve(result);
}
}
);
};
return deferred.promise;
};
UserProvider.prototype.findByIdPromise = function(id) {
var finder = new UserProvider.findOnePromise();
finder.setUserId(id);
return this.getCollectionPromise().then(finder.findUser);
};
答案 0 :(得分:1)
在Node.js中执行异步工作的标准方法是通过回调(通常是函数的最后一个参数),它将错误作为其第一个参数,将任何后续参数作为返回值。这是标准库(即内置包)以及使用此样式的大多数流行的npm模块的标准。
如果您愿意,当然,您完全欢迎使用承诺。但是,我会建议不要这样做;你将最终包装几乎你使用的每个库,以便将它从回调转换为promises,这不是一个特别有趣的练习。
注意:我所知道的唯一使用promises且非常受欢迎的例外是selenium-webdriver
。据我所知,它使用promises,因此使用它编写的代码看起来与其他selenium库尽可能相似,这些库都是同步的。