Promise thenthen方法可以让异步操作成功或失败时得到通知 。它包含两个参数,一个用于成功执行,另一个则在发生错误时使用 。
promise.then(onSuccess, onError);
你还可以使用catch来处理错误:
promise.then(onSuccess).catch(onError);
Promise 链then 返回一个新的 Promise,这样就可以将多个Promise 链接在一起 。就像下面的例子一样:
Promise.resolve() .then(() => console.log('then#1')) .then(() => console.log('then#2')) .then(() => console.log('then#3'));
Promise.resolve立即将Promise 视为成功 。因此,以下所有内容都将被调用 。输出将是
then#1then#2then#3
Promise catchPromise .catch方法将函数作为参数处理错误 。如果没有出错,则永远不会调用catch方法 。
假设我们有以下承诺:1秒后解析或拒绝并打印出它们的字母 。
const a = () => new Promise((resolve) => setTimeout(() => { console.log('a'), resolve() }, 1e3));const b = () => new Promise((resolve) => setTimeout(() => { console.log('b'), resolve() }, 1e3));const c = () => new Promise((resolve, reject) => setTimeout(() => { console.log('c'), reject('Oops!') }, 1e3));const d = () => new Promise((resolve) => setTimeout(() => { console.log('d'), resolve() }, 1e3));
请注意,c使用reject('Oops!')模拟了拒绝 。
Promise.resolve() .then(a) .then(b) .then(c) .then(d) .catch(console.error)
输出如下:
文章插图
在这种情况下,可以看到a,b和c上的错误消息 。
我们可以使用then函数的第二个参数来处理错误 。但是,请注意,catch将不再执行 。
Promise.resolve() .then(a) .then(b) .then(c) .then(d, () => console.log('c errored out but no big deal')) .catch(console.error)
文章插图
由于我们正在处理 .then(..., onError)部分的错误,因此未调用catch 。d不会被调用 。如果要忽略错误并继续执行Promise链,可以在c上添加一个catch 。像这样:
Promise.resolve() .then(a) .then(b) .then(() => c().catch(() => console.log('error ignored'))) .then(d) .catch(console.error)
文章插图
当然,这种过早的捕获错误是不太好的,因为容易在调试过程中忽略一些潜在的问题 。
Promise finallyfinally方法只在 Promise 状态是 settled 时才会调用 。
如果你希望一段代码即使出现错误始终都需要执行,那么可以在.catch之后使用.then 。
Promise.resolve() .then(a) .then(b) .then(c) .then(d) .catch(console.error) .then(() => console.log('always called'));
或者可以使用.finally关键字:Promise.resolve() .then(a) .then(b) .then(c) .then(d) .catch(console.error) .finally(() => console.log('always called'));
1.4 Promise 类方法我们可以直接使用 Promise 对象中四种静态方法 。- Promise.all
- Promise.reject
- Promise.resolve
- Promise.race
Promise.resolve('Yay!!!') .then(console.log) .catch(console.error)
上面会输出 Yay!!!Promise.reject('Oops ') .then(console.log) .catch(console.error)
使用 Promise.all 并行执行多个 Promise通常,Promise 是一个接一个地依次执行的,但是你也可以并行使用它们 。假设是从两个不同的api中轮询数据 。如果它们不相关,我们可以使用Promise.all()同时触发这两个请求 。
在此示例中,主要功能是将美元转换为欧元,我们有两个独立的 API 调用 。一种用于BTC/USD,另一种用于获得EUR/USD 。如你所料,两个 API 调用都可以并行调用 。但是,我们需要一种方法来知道何时同时完成最终价格的计算 。我们可以使用Promise.all,它通常在启动多个异步任务并发运行并为其结果创建承诺之后使用,以便人们可以等待所有任务完成 。
推荐阅读
- 经期喝枸杞茶可以吗,经期能喝菊花茶吗,经期应该避免喝菊花茶
- 进故宫旅游应该先从什么地方进 游故宫要注意的事情是什么
- 喝茶应该配什么茶点,个茶壶配应该配几个茶杯
- 口腔溃疡应该吃什么好 口腔溃疡药膳调理食疗方
- 女生单身戒指应该戴在哪个手指
- 神经性厌食
- 青少年体育运动应该注意什么
- 出现虚胖应该如何减肥?
- 运动健身计划应该怎么实施?
- 高考语文最后阶段应该如何冲刺提分