在使用 Promise 链式调用时,有几点需要注意:
- 返回值处理:
- 如果你在
.then()方法中返回一个非Promise的值,那么下一个.then()接收到的就是这个值。 - 如果你返回的是一个新的
Promise,那么下一个.then()将等待这个新的Promise完成,并接收它的结果。如果这个Promise被 rejected,它将跳过后续的.then()并进入最近的.catch()。
- 如果你在
- 错误处理:
- 任何
.then()中抛出的错误或返回的被拒绝的Promise都会被传递给链中的下一个.catch()或者是紧跟在后面的.then(null, rejection)。 - 通常建议在链的最后添加一个
.catch()来捕获所有未处理的错误,以防止沉默失败(即错误没有被捕获)。 - 注意不要单独使用
.then(onFulfilled),因为这样会丢失可能的异常,最好总是提供两个参数或者在后面跟上.catch()。
- 任何
- 避免嵌套:
- 应该尽量避免在
.then()回调中创建新的Promise和再次使用.then(),这会导致不必要的嵌套和难以追踪的代码逻辑。而是应该让每个.then()返回一个新的Promise,从而保持链条的平坦和平滑。
- 应该尽量避免在
- 同步与异步混淆:
- 在
.then()回调函数中执行的操作是异步的,即使它们看起来像是同步操作。确保理解这一点,因为这可能会影响代码的行为和调试。
- 在
- 立即解析的 Promise:
- 如果你需要立即解析一个
Promise,可以使用Promise.resolve(value),这将创建一个已经处于 fulfilled 状态的Promise,其结果为value。类似地,Promise.reject(reason)可以创建一个已经处于 rejected 状态的Promise。
- 如果你需要立即解析一个
- 避免遗忘 return:
- 如果你不返回从
.then()回调函数返回的Promise,后续的.then()不会等待那个Promise完成。记住在需要链接的时候要return。
- 如果你不返回从
- 理解上下文:
- 在
.then()回调中,this关键字不会指向调用Promise的对象,因为它遵循 JavaScript 函数的一般规则。如果你需要访问外部上下文,考虑使用箭头函数或显式绑定this。
- 在
- Promise 链的终止:
- 如果你不希望继续链下去,可以在链的某个点上不再调用
.then()或其他相关方法。但是要注意,未处理的拒绝可能会导致未捕获的拒绝事件,这在某些环境中可能会导致警告或错误。
- 如果你不希望继续链下去,可以在链的某个点上不再调用
367

被折叠的 条评论
为什么被折叠?



