承诺即使在发生错误的情况下也会解决并触发下一个功能
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));
从您的示例中不能立即清楚的一件事是 path
和 data
是否由 getData()
返回,这会稍微改变答案。
如果无论返回的 promise 是 resolves 还是 rejects 都想执行相同的回调(并且不需要从 getData()
获取 path
和 data
),你可以使用 Promise.prototype.finally()
:
getData(this.props.data, {})
.finally(() => updateInfo('UPDATE_INFO', path, data));
或者,如果你想根据 promise 是解析还是拒绝(即 path
和 data
由 getData()
返回)有不同的行为,你可以做类似的事情:
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)
})
在某些情况下,'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));
从您的示例中不能立即清楚的一件事是 path
和 data
是否由 getData()
返回,这会稍微改变答案。
如果无论返回的 promise 是 resolves 还是 rejects 都想执行相同的回调(并且不需要从 getData()
获取 path
和 data
),你可以使用 Promise.prototype.finally()
:
getData(this.props.data, {})
.finally(() => updateInfo('UPDATE_INFO', path, data));
或者,如果你想根据 promise 是解析还是拒绝(即 path
和 data
由 getData()
返回)有不同的行为,你可以做类似的事情:
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)
})