何时使用denodeify / nfbind vs nfcall / ninvoke

时间:2014-03-12 12:30:20

标签: mongoose promise q

我和Mongoose合作,我想对Q库使用承诺方法。

不确定何时使用各种方法nfcall,nfinvoke或用denodeify / nfbind包装API

示例:

var p = Q.when(User.findOne({login: 'johndoe'}).exec());
p.then(...)

或类似的东西:

Q.ninvoke(User, 'findOne', '{login:"johndoe"}').then(...)

或者包装API,如:

'use strict';

    //pUser.js Q/promise wrapper
    var Q = require('q'),
    mongoose = require('mongoose'),
    User = mongoose.model('User');

    exports.findOne = function() {
    return Q.denodefiy(User.findOne);
    }

    //and then use like:
    var pUser = require('pUser');

    pUser.findOne({...}).then(function(user) { ... });

我也看到像this这样的方法用nfbind或类似方法包装每个方法

由于

1 个答案:

答案 0 :(得分:3)

Mongoose(至少在过去一年左右)已经回复了Promises / A + spec投诉的承诺。

除非必须,否则你不需要将它们包装在Q承诺中。问:作为承诺/ A +投诉本身很乐意消费这些承诺并与你互动。

例如,您可以在Q.all的三次调用中使用find(...).exec()

 Q.all([
     User.find({route: foo}).exec(), // Q will detect that the values are 'thenable'
     User.find({route: bar}).exec(), // and will automatically assimilate them into a 
     User.find({route: baz}).exec()  // Q promise on its own. No explicit action needed.
]).spread(function(res1,res2,res3){
     // access results.
});