【问题标题】:Return another promise from a promise从一个承诺中返回另一个承诺
【发布时间】:2015-04-11 19:46:28
【问题描述】:

我有一个对象的承诺,并希望获得该对象的属性的承诺。我该怎么做?

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 Promises 也只有类似的结构。
  • 你为什么不链接user呢? user.then(function() {}, function() {})。你也可以从 promise 返回一个标量值。
  • 你没有返回resolve,所以accessToken是undefined
  • @KrzysztofSafjanowski 已更新! ^
  • 我强烈推荐阅读 Promises/A+ 规范。它不长,很容易理解,适用于几乎所有的 Promise 库:promisesaplus.com

标签: javascript promise q


【解决方案1】:

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

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 是多么容易出错:-)

【讨论】:

  • 如果以后accessToken没有“使用”或“调用”,会调用用户吗?
  • @mushroom "promises" 不提供懒惰。
  • @mushroom user 是一个承诺。它不能被调用。如果您的意思是 User.findOne 已经通过 Q.nfcall 明确调用它来创建承诺。
  • @Bergi 啊,是的,我一时感到困惑,应该先考虑更多。所以Q.nfcall() 立即执行User.findOne() 并返回user 的承诺。现在一切都说得通了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 2015-06-05
  • 1970-01-01
  • 2015-12-16
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多