承诺即使在发生错误的情况下也会解决并触发下一个功能

Promise resolve even in case of error and trigger then next function

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

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

我该如何解决这个问题?

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

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

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

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

如果无论返回的 promise 是 resolves 还是 rejects 都想执行相同的回调(并且不需要从 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));

正确的方法是使用 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);

如果你不想使用 finally 因为旧版本的 Node 或者不是 bluebird promise。

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