如何将下面的代码替换为Bluebird Promise风格?

Kri*_*ris 3 mongoose node.js bluebird

所有我对bluebird/promiseA +几乎都是新手,我想知道如何将下面的mongoose代码替换为bluebird风格?

UserUnit.find({ user_id: req.user._id }).populate('unit_id').exec(function (err, units) {
    if (err) {
        res.send(err)
    } else {
        a = a + b;
        res.json(units)
    }
})
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

var Promise = require('bluebird')

Promise.promisifyAll(UserUnit)
Promise.promisifyAll(UserUnit.prototype)

var Promise = require('bluebird')

Promise.promisifyAll(UserUnit)
Promise.promisifyAll(UserUnit.prototype)

UserUnit.findAsync({ user_id : req.user._id })
.spread(function (rs) {
    return Promise.try(function() {
        return rs.populate('unit_id')
    })
}).then(function (units) {
    res.json(units)
}).catch(function (err) {
    if (err) res.send(err)
})
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 7

UserUnit.find不是回调方法,甚至UserUnit.findAsync不是异步,所以没有意义.你不应该宣传你自己的课程,你应该让你的clasess返回承诺开始.

如果你在某个地方宣传了猫鼬:

Promise.promisifyAll(require("mongoose"));
Run Code Online (Sandbox Code Playgroud)

你可以做

UserUnit.find({ user_id: req.user._id })
    .populate("unit_id")
    .execAsync()
    .then(function(units) {
        res.json(units);
    })
    .catch(function(err) {
        res.send(err);
    });
Run Code Online (Sandbox Code Playgroud)