最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
怎样用 Promise.resolve 统一封装同步逻辑与异步任务的执行链路
时间:2026-06-29 10:15:56 编辑:袖梨 来源:一聚教程网
Promise.resolve 的核心价值是将任意值统一转为可链式调用的 Promise 实例,使同步与异步逻辑共享 .then/.catch 流程,消除分支判断;但不捕获同步异常,需手动 try/catch 或改用 .then(() => fn())。
Promise.resolve 的核心价值,是把任意值(包括同步返回值、已决议的 Promise、甚至错误)统一转为一个“可链式调用的 Promise 实例”,从而让同步逻辑和异步任务共享同一套 .then() / .catch() 执行流,消除分支判断,简化流程控制。
用 Promise.resolve 包裹同步值,获得标准 Promise 行为
同步函数返回原始值(如字符串、对象、数字),无法直接接 .then();而 Promise.resolve(value) 会立即返回一个已 fulfilled 的 Promise,后续可自然链式处理:
- 普通值(
42、"ok"、{data: true})→ 转为Promise.resolve(42),.then(v => ...)中的v就是原值 -
null或undefined同样适用,不会报错,可安全参与链路 - 避免手写
Promise.resolve().then(() => value)这类冗余写法
统一处理可能同步、也可能异步的函数返回值
当一个工具函数既可能同步返回结果,也可能返回 Promise(例如缓存命中时同步返回、未命中时异步请求),用 Promise.resolve(fn()) 可抹平差异:
- 若
fn()返回"cached"→Promise.resolve("cached")→.then正常执行 - 若
fn()返回fetch('/api')(Promise)→Promise.resolve(fetch(...))等价于直接使用该 Promise,不额外嵌套 - 注意:不要对已知 Promise 多次包裹(如
Promise.resolve(Promise.resolve(x))),虽无害但无必要
配合 async/await 保持链路一致性(尤其在工具函数中)
在封装通用中间件或拦截器时,希望所有处理步骤都支持同步/异步混合,可统一用 Promise.resolve(...).then(...) 构建执行链:
- 例如权限校验函数:
const check = () => user.token ? true : Promise.reject('no token') - 统一调用:
Promise.resolve(check()).then(() => fetchAPI()).catch(handleError),无论check()是布尔还是 Promise 都能走通 - 比
if (check() instanceof Promise) { ... } else { ... }更简洁、不易漏判
小心陷阱:Promise.resolve 不捕获同步异常
Promise.resolve(fn()) 中,若 fn() 抛出错误(如 throw new Error('boom')),该错误**不会被自动转为 rejected Promise**,而是直接抛出,中断当前执行栈:
- ❌ 错误用法:
Promise.resolve(() => { throw 'err' })()—— 这里只是把函数本身包进 Promise,没执行它 - ❌ 危险写法:
Promise.resolve(fn()),其中fn内部 throw → 同步错误,不进.catch() - ✅ 正确做法:用
try/catch手动捕获,或改用Promise.try(需 polyfill),或直接写Promise.resolve().then(() => fn())