promise.then() 的大坑

这次想用promise.then 做一个异步请求

addTable().then(resolve())   注:这是错误写法,没有一部效果

addTable().then(()=> {  resolve()  })   注:这是正确的

<think> 我们正在详细解释JavaScript中Promise对象的then方法。根据引用[2],Promise的设计思想是所有异步任务返回一个Promise实例,该实例有一个then方法用于指定下一步的回调函数。引用[3]和[4]展示了then方法的使用示例。 then方法是Promise的核心,用于处理Promise的完成(fulfilled)或拒绝(rejected)状态。它的基本语法如下: ```javascript promise.then( onFulfilled, // 当Promise状态变为fulfilled时调用的函数,接收完成值作为参数 onRejected // 当Promise状态变为rejected时调用的函数,接收拒绝原因作为参数(可选) ); ``` ### 1. then方法的基本使用 - **处理完成状态**:当Promise被resolve时,执行`onFulfilled`回调 ```javascript new Promise((resolve) => resolve('成功')).then(value => console.log(value)); // 输出"成功" ``` - **处理拒绝状态**:当Promise被reject时,执行`onRejected`回调 ```javascript new Promise((_, reject) => reject('失败')).then(null, reason => console.log(reason)); // 输出"失败" ``` ### 2. then方法的链式调用(引用[4]) then方法返回一个新的Promise,支持链式调用: ```javascript loadScript('one.js') .then(script => loadScript('two.js')) // 返回新Promise .then(script => loadScript('three.js')) .then(script => { one(); two(); three(); }); ``` 链式调用的规则: 1. 如果前一个`then`的回调返回普通值(非Promise),该值作为下一个`then`的输入 ```javascript Promise.resolve(1) .then(v => v + 2) // 返回3 .then(v => console.log(v)); // 输出3 ``` 2. 如果回调返回Promise,则下一个`then`等待该Promise解决 ```javascript Promise.resolve(1) .then(v => new Promise(resolve => setTimeout(() => resolve(v + 2), 1000))) .then(v => console.log(v)); // 1秒后输出3 ``` ### 3. 错误处理(引用[3]) - 通过`then`的第二个参数`onRejected`捕获错误 ```javascript Promise.reject('error') .then( value => console.log('成功', value), reason => console.log('失败', reason) // 捕获并输出"失败 error" ); ``` - 更推荐使用`catch`方法统一捕获链式调用中的错误: ```javascript Promise.resolve() .then(() => { throw new Error('错误') }) .catch(err => console.error(err)); // 捕获错误 ``` ### 4. 注意事项 1. **状态不可逆**(引用[3]):Promise状态一旦确定(fulfilled/rejected)就不能更改 ```javascript const p = new Promise((resolve, reject) => { resolve('成功'); // 状态锁定为fulfilled reject('失败'); // 无效 }); ``` 2. **回调执行时机**:`then`的回调属于微任务,在当前宏任务结束后执行[^2][^3] ```javascript console.log('开始'); Promise.resolve().then(() => console.log('微任务')); console.log('结束'); // 输出顺序:开始 → 结束 → 微任务 ``` 3. **透传特性**:当`then`缺少处理函数时,值会“穿透”到后面的处理函数 ```javascript Promise.resolve('穿透') .then() .then(v => console.log(v)); // 输出"穿透" ``` ### 5. 使用场景 - **异步流程控制**:解决回调地狱,实现顺序异步操作(如引用[4]的脚本加载) - **错误集中处理**:通过`catch`统一处理多个异步操作的错误 - **并行异步管理**:结合`Promise.all`/`Promise.race`等类方法 --- §§相关问题§§ 1. Promise的catch方法和then的第二个参数有何区别? 2. 如何中断Promise链式调用? 3. Promise.all和Promise.race的使用场景有什么不同? 4. async/await与Promise.then有何性能差异? [^1]: Promise.resolve相当于new Promise并执行resolve操作 [^2]: Promise的设计思想与基本状态 [^3]: Promise状态不可逆及then方法执行机制 [^4]: then方法链式调用实现异步任务序列 </think>### JavaScript Promise 的 `then` 方法详解 `then` 方法是 Promise 最核心的实例方法,用于处理 Promise 的**异步操作结果**(成功或失败)。其语法为: ```javascript promise.then( onFulfilled, // 成功回调 (必选) onRejected // 失败回调 (可选) ); ``` #### 一、核心特性 1. **链式调用** `then` 始终返回**新的 Promise 对象**,支持无限链式调用: ```javascript fetchData() .then(handleSuccess) // 第一个then处理成功 .then(processData) // 接收上一步返回值 .catch(handleError); // 统一捕获错误 ``` 引用[4]展示了链式加载脚本的经典案例[^4]。 2. **值传递与穿透** - 若回调返回普通值,直接传递给下一个 `then`: ```javascript Promise.resolve(2) .then(v => v * 3) // 返回6 .then(v => console.log(v)); // 输出6 ``` - 若未提供回调,值会"穿透"到后续 `then`: ```javascript Promise.resolve('穿透') .then() // 无回调 .then(v => console.log(v)); // 输出"穿透" ``` 引用[3]提到状态不可逆特性[^3]。 3. **错误处理优先级** - 优先使用当前 `then` 的 `onRejected` - 若无定义,则错误冒泡到后续 `catch`: ```javascript Promise.reject('error') .then(null, reason => console.log('捕获')) // 触发此处理 .catch(err => console.log('不会执行')); ``` --- #### 二、使用场景 1. **异步流程控制** ```javascript // 模拟异步操作链 login(user) .then(token => fetchUserData(token)) .then(data => renderProfile(data)); ``` 2. **组合多个 Promise** ```javascript const p1 = fetch('/api/a'); const p2 = fetch('/api/b'); p1.then(resA => p2.then(resB => combine(resA, resB)) ); ``` 3. **延迟执行** ```javascript const delay = (ms) => new Promise(res => setTimeout(res, ms)); delay(1000) .then(() => console.log('1秒后执行')); ``` --- #### 三、注意事项 1. **回调执行时机** 回调属于**微任务**,在同步代码执行后、渲染前触发(引用[3])[^3]。 2. **避免嵌套陷阱** ❌ 错误写法(回调地狱变体): ```javascript fetchA().then(a => { fetchB(a).then(b => { // 嵌套then // ... }); }); ``` ✅ 正确写法(链式展开): ```javascript fetchA() .then(a => fetchB(a)) .then(b => { /* ... */ }); ``` 3. **必须提供 onFulfilled** 若省略 `onFulfilled`,需用 `null` 占位: ```javascript promise.then(null, onRejected); // 仅处理错误 ``` --- ### 回调函数参数说明 | **参数** | **类型** | **触发条件** | **返回值影响** | |----------------|--------------|---------------------|--------------------------------| | `onFulfilled` | `Function` | Promise resolve 时 | 返回值作为新 Promise 的决议值 | | `onRejected` | `Function` | Promise reject 时 | 返回值作为新 Promise 的决议值 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值