Node.js,mongo,promises - 将参数传递给then函数

时间:2013-12-11 01:47:09

标签: node.js mongodb promise

使用带有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);
};

1 个答案:

答案 0 :(得分:1)

在Node.js中执行异步工作的标准方法是通过回调(通常是函数的最后一个参数),它将错误作为其第一个参数,将任何后续参数作为返回值。这是标准库(即内置包)以及使用此样式的大多数流行的npm模块的标准。

如果您愿意,当然,您完全欢迎使用承诺。但是,我会建议不要这样做;你将最终包装几乎你使用的每个库,以便将它从回调转换为promises,这不是一个特别有趣的练习。

注意:我所知道的唯一使用promises且非常受欢迎的例外是selenium-webdriver。据我所知,它使用promises,因此使用它编写的代码看起来与其他selenium库尽可能相似,这些库都是同步的。