5月27日 01:15

ES6 中有哪些解决异步的方法?

ES6 之后异步方案演进:

回调函数:最原始的方式,问题是回调地狱(callback hell)——多层嵌套,错误处理困难。

Promise:ES6 引入。把回调的嵌套转成 .then() 的链式调用,用 .catch() 统一处理错误。解决了回调地狱,但长链 .then() 仍然不够直观。

Generator + co:通过 yield 暂停函数执行,配合自动执行器(如 co 库)实现类似同步的写法。现在基本被 async/await 取代。

async/await:ES8(ES2017)正式引入。Promise 的语法糖——async 函数返回 Promise,await 暂停执行等待 Promise 完成。写法最像同步代码:

javascript
async function getData() { const res = await fetch('/api'); const data = await res.json(); return data; }

追问

Promise.all、Promise.allSettled、Promise.race、Promise.any 的区别?

  • all:全成功才成功,一个失败就失败
  • allSettled:等全部完成(不管成败),返回结果数组含状态标记
  • race:第一个完成的就返回(不管成败)
  • any:第一个成功的就成功,全失败才失败(和 race 相反)

async/await 的错误怎么处理?

try-catch 包裹 await。或者用 .catch() 链在 async 函数的返回值上。也可以用 await promise.catch(() => fallbackValue) 的模式给错误设默认值。

标签:前端ES6