【问题标题】:Promise that returns second promise result if first fails如果第一次失败,则返回第二个 Promise 结果的 Promise
【发布时间】:2016-04-28 05:55:30
【问题描述】:

如果第一个(缓存中的值)失败,我想返回第二个承诺的值。

我有以下代码,但没有定义解析。

exports.getConfig = function (a, r) {
  return new Promise(resolve, reject)    {
    getConfigFromCache(a, r)
        .catch(function(e){
            getRouteConfigFromWeb(a, r)
        }).then(function(result) {
            //return value of the promise that was called
            resolve(result)
        })
  }
};

假设 getConfigFromCache 和 getRouteConfigFromWeb 都正确返回了 Promise。

有没有办法做到这一点,还是我想错了?

【问题讨论】:

  • 你...从未调用过resolve或reject...
  • 感谢您指出这一点。调用 resolve(result) 时我仍然遇到同样的问题
  • 尝试缓存resolve。 var _resolve = resolve; 或类似的东西,然后再输入 getConfig
  • 是.then() 应该返回getConfigFromCache 或 ``getRouteConfigFromWeb` 的结果,无论使用哪个?
  • Alnitak,没错。

标签: javascript promise bluebird


【解决方案1】:

您根本不需要创建新的Promise:

exports.getConfig = function (a, r) {
    var cache = getConfigFromCache(a, r);
    return cache.catch(function(e) {
        return getRouteConfigFromWeb(a, r);  // NB: return *essential*
    });
}

如果 getConfigFromCache() 调用成功,则解析后的 Promise 应跳过 .catch 并直接返回。

如果缓存调用失败,则返回从 getRouteConfigFromWeb() 返回的 Promise。

我还注意到,您问题的第一行实际上给出了解决方案:“如果第一个(缓存中的值)失败,我想返回第二个承诺的值。” -你从来没有真正在.catch 块中放置return!

【讨论】:

  • 没错。诺言终究是通过了。
  • @user1886721 原始代码中缺少的关键是.catch 块内的return。没有它,Promise 链就断了。
猜你喜欢
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2019-02-09
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多