【问题标题】:Promise resolve even in case of error and trigger then next function即使在发生错误的情况下也承诺解决并触发然后下一个功能
【发布时间】:2020-02-01 09:31:34
【问题描述】:

在某些情况下,“getData”会引发错误,但无论如何我都需要解决它。 如何解决 'getData' 并确保调用 'updateInfo' 即使 'getData' 抛出错误?

getData(this.props.data, {})
  .then(
    () => updateInfo('UPDATE_INFO', path, data)
  );

我该如何解决这个问题?

Promise.resolve(
  getData(this.props.data, {}))
    .then(
      () => updateInfo('UPDATE_INFO', path, data)
    );

【问题讨论】:

    标签: javascript reactjs error-handling promise resolve


    【解决方案1】:

    如果您不想使用 finally 是因为旧版本的 Node 或不是 bluebird 承诺。

    .then接受第二个参数表示拒绝promise

    getData(this.props.data, {})
        .then(
            () => updateInfo('UPDATE_INFO', path, data), (error) => updateInfo('UPDATE_INFO', path, data)
        );
    

    或者在.catch中实现同样的代码

    getData(this.props.data, {})
        .then(
            () => updateInfo('UPDATE_INFO', path, data)
        ).catch(error => {
            console.log(error)
            return updateInfo('UPDATE_INFO', path, data)
        })
    

    【讨论】:

      【解决方案2】:

      正确的方法是使用Promise.finally(),但如果没有,您可以在then()catch() 阶段触发下一个函数:

      getData(this.props.data, {})
          .then(
              () => updateInfo('UPDATE_INFO', path, data)
          ).catch(
              () => updateInfo('UPDATE_INFO', path, data)
          );
      

      你可以重构成:

      const update = updateInfo.bind(null,'UPDATE_INFO', path, data);
      getData(this.props.data, {})
          .then(update)
          .catch(update);
      

      或者更简单地说:

      const update = updateInfo.bind(null,'UPDATE_INFO', path, data);
      getData(this.props.data, {}).then(update,update);
      

      【讨论】:

        【解决方案3】:

        从您的示例中没有立即清楚的一件事是 pathdata 是否由 getData() 返回,这会稍微改变答案。

        如果你想不管返回的promise是解析还是拒绝都执行相同的回调(并且你不需要从getData()获取pathdata),你可以使用Promise.prototype.finally()

        getData(this.props.data, {})
          .finally(() => updateInfo('UPDATE_INFO', path, data));
        

        或者,如果您希望根据 promise 是解析还是拒绝(即 pathdatagetData() 返回)具有不同的行为,您可以执行以下操作:

        getData(this.props.data, {})
          .catch(e => /* handle error */) // If this callback doesn't throw an error or return a promise that rejects, it returns a resolved promise
          .then((path = null, data = {}) => updateInfo('UPDATE_INFO', path, data));
        

        【讨论】:

        • 不,getData() 不返回路径和数据
        • 那么Promise.prototype.finally()绝对是你想要的!
        【解决方案4】:

        如果您希望对错误和成功案例都采取行动,而不是有意解决承诺,您可以在 Promise 上使用.finally

        getData(this.props.data, {}).finally(() => updateInfo('UPDATE_INFO', path, data));
        

        【讨论】:

        • 最后你还需要使用.then.catch。因为如果有任何错误,您将不会发现错误。
        • 好的,如果失败,拒绝'getData()'调用如何,只调用'updateInfo'?
        • @Sunny 那么你只需要finally 块。
        • @AZ_ catch 和 then 仅在您也需要分别进行成功和错误处理时才需要。我不认为对于 OP,也需要使用 .then 和 .catch
        • 我的意思是如果 getData() 没问题,那么同时调用 getData() 和 updateInfo(),否则只调用 updateInfo()。应该怎么处理?
        猜你喜欢
        • 2022-11-14
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2013-11-03
        • 2015-04-13
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多