Node.js,mongo,promise – 将parameter passing给then函数

使用node.js,而不是callback,通过指定用户ID从mongo中检索用户对象。 Db访问使用require('mongodb').Db

调用从下面的代码的底部开始: findByIdPromise(userId)
collection.findOne()需要userId作为参数,但是then()以promise作为单个参数来调用一个函数。

为了绕过这个限制,我传递了一个具有userId属性预设的对象finder ,以及一个采用集合promise的函数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); }; 

在Node.js中执行asynchronous工作的标准方法是通过callback函数(通常是函数的最后一个参数),该函数将错误作为第一个参数,并将任何后续参数作为返回值。 这是由标准库(即内置软件包)以及大多数使用这种风格的stream行npm模块制定的标准。

当然,如果您愿意的话,您完全可以使用诺言。 不过,我会反对这个build议。 你将最终包装你使用的几乎所有的库,以便将其从callback转换为承诺,这不是一个特别有趣的练习。

注:我知道唯一的例外是使用承诺,是相当stream行的是selenium-webdriver 。 据我所知,它使用承诺,使用它编写的代码看起来尽可能类似于其他selenium库,这是​​所有同步。