从一个 Promise 返回另一个 Promise

3

我有一个对象的承诺,想要获得该对象属性的承诺。我应该如何做?

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);
    });
});

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

是的,这看起来很好。甚至ES6 Promise的结构也类似。 - thefourtheye
为什么不把 user 链接起来呢?user.then(function() {}, function() {})。你也可以从 Promise 中返回一个标量值。 - zerkms
您未返回“resolve”,因此accessToken为“undefined”。 - Krzysztof Safjanowski
@KrzysztofSafjanowski 已更新!^ - mushroom
我强烈建议阅读 Promises/A+ 规范。它不长,易于理解,并适用于几乎任何 Promise 库:https://promisesaplus.com - Zenorbi
1个回答

7
不要使用deferred antipattern1!没有必要使用Promise构造函数,.then已经为其回调的结果返回了一个promise:
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]: 你已经亲身体验了它有多容易出错 :-)


如果accessToken未被“使用”或“调用”,用户会被召唤吗? - mushroom
@mushroom,“promises”不提供惰性。 - zerkms
@mushroom user 是一个 Promise。它不能被调用。如果你的意思是 User.findOne,那么你已经通过 Q.nfcall 显式地调用它来创建 Promise 了。 - Bergi
1
@Bergi 没错,我一时有些困惑,应该先仔细思考一下。所以 Q.nfcall() 立即执行了 User.findOne() 并返回一个 user 的 promise。现在一切都清晰了,谢谢! - mushroom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接