初学者应该看的JavaScript Promise 完整指南( 二 )


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#3Promise 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)输出如下:

初学者应该看的JavaScript Promise 完整指南

文章插图
 
在这种情况下,可以看到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)
初学者应该看的JavaScript Promise 完整指南

文章插图
 
由于我们正在处理 .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) 
初学者应该看的JavaScript Promise 完整指南

文章插图
 
当然,这种过早的捕获错误是不太好的,因为容易在调试过程中忽略一些潜在的问题 。
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 和 Promise.reject这两个是帮助函数,可以让 Promise 立即解决或拒绝 。可以传递一个参数,作为下次 .then 的接收:
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,它通常在启动多个异步任务并发运行并为其结果创建承诺之后使用,以便人们可以等待所有任务完成 。


推荐阅读