Return 承诺中的另一个承诺

Return another promise from a promise

我有一个对象的承诺,我想得到一个 属性 该对象的承诺。我应该怎么做?

var user = Q.nfcall(User.findOne, {
    _id: userId
});
var accessToken = Q.Promise(function (resolve, reject) {
    user.then(function (user) {
        if (!user) return reject(new Error('User not found.'));
        if (!user.github.accessToken) return reject(new Error('Access token not found.'));
        return resolve(user.github.accessToken);
    }, function(err) {
        return reject(err);
    });
});

这是我迄今为止尝试过的方法,但我不确定它是否是最好(或最正确)的方法。

不要使用deferred antipattern1!无需使用 Promise 构造函数,.then 已经 returns 你对其回调结果的承诺:

var accessToken = user.then(function(user) {
    if (!user) throw new Error('User not found.');
    if (!user.github.accessToken) throw new Error('Access token not found.');
    return user.github.accessToken;
});

[1]:你 seen yourself 多么容易出错 :-)