javascriptPromise如何使用_怎样优雅地处理异步操作【教程】

5次阅读

promise构造函数必须传入执行器函数,否则报错;then链中错误捕获遵循就近原则,推荐用.then().catch();async/await需用try/catch包裹await;并行选Promise.all(全成功)、allSettled(全返回)、race(首个settled)。

javascriptPromise如何使用_怎样优雅地处理异步操作【教程】

Promise 构造函数怎么写才不会报 undefinedexecutor is not a function

Promise 必须传入一个执行器函数(executor),它接收 resolvereject 两个参数。常见错误是漏写函数、传了 NULL 或直接传值:

  • ❌ 错误写法:new Promise(null)new Promise(123)new Promise()(无参)
  • ✅ 正确写法:new Promise((resolve, reject) => { /* 异步逻辑 */ })
  • ⚠️ 注意:executor 会立即同步执行,所以里面不能只放同步代码还期望“等一会再 resolve”——那只是普通函数调用,不是异步控制

thencatch 链式调用中,错误到底被谁捕获?

Promise 链的错误传递遵循就近原则,但容易误判位置。关键点在于:then 的第二个参数只捕获前一个 Promise 的 rejection,而 catch 会捕获链上前面所有未处理的 rejection。

  • promise.then(success, fail) 中的 fail 不会捕获 success 内抛出的错误
  • ✅ 推荐写法:promise.then(success).catch(fail) —— 这样 success 函数里 throw 或返回被 reject 的 Promise 都会被 catch 捕获
  • ⚠️ 注意:catch 后如果没再抛错,后续 then 仍会执行(因为 catch 默认返回 fulfilled 状态)

async/await 替代 then 链时,try/catch 怎么配对才不漏错?

async/await 让异步像同步一样写,但错误处理必须显式用 try/catch,否则未捕获的 rejection 会变成 unhandled rejection。

  • ✅ 必须把 await 表达式包在 try 块里:try { const data = await fetch(...); } catch (err) { ... }
  • ⚠️ catch 只捕获当前 await 的 rejection,多个 await 要共用一个 try/catch 才能统一处理,或各自独立处理
  • ⚠️ 不要这样写:const data = await fetch(...).catch(...) —— 这会让 data 变成 undefined 或错误对象,破坏类型预期

多个异步操作并行还是串行?Promise.allPromise.allSettledPromise.race 怎么选?

选错方法会导致逻辑异常或掩盖问题。核心区别不在“快慢”,而在“失败策略”和“返回结构”:

立即学习Java免费学习笔记(深入)”;

  • Promise.all:全部成功才 resolve,任一 reject 整体 reject —— 适合强依赖场景(如同时上传多个文件,缺一不可)
  • Promise.allSettled:不管成败都等全部结束,返回每个结果的状态对象 —— 适合批量请求且需分别处理(如发 5 个 API,统计成功几个)
  • Promise.race:谁先 settle(fulfill 或 reject)就用谁的结果 —— 常用于超时控制:Promise.race([fetch(), timeout(5000)])
  • ⚠️ 注意:Promise.all 中某个 Promise 抛错后,其他仍在运行(不会自动取消),如需中断,得靠 AbortController 等机制配合

真正难的不是写对语法,而是判断哪个环节该 reject、哪个该 catch、哪个该吞掉、哪个该重试——这些没法靠 Promise 自动推断,得结合业务语义来设计。

text=ZqhQzanResources