ES8 最常见的 BUG 及解决方式:体验 Promise 构造函数异常

ES8 中增加了许多新的功能和语法糖,其中 Promise 构造函数是一个非常重要的新特性。Promise 是一种协调异步操作的一种解决方案,可以将异步操作写成同步操作的形式,更加方便和可读。但是,在实际应用中,还是有一些常见的 BUG,下面我们来详细解析并提供解决方式。

BUG 1:Promise 构造函数没有捕获异常

Promise 构造函数是 Promise 最基础的用法,一旦 Promise 出现异常,应该及时捕获异常并处理。但是,有时 Promise 构造函数并不会捕获异常,这就导致了代码出现 BUG。下面是一个典型的例子:

const promise = new Promise((resolve, reject) => {
  foo.bar() // 没有定义 `foo.bar`
  resolve('成功')
})
promise.then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

在这段代码中,Promise 构造函数执行时会出现 ReferenceError,但是没有被 catch 到,导致控制台会抛出未捕获的异常。

解决方案:

为了正确地捕获 Promise 构造函数中的异常,我们需要在 Promise 构造函数内部添加 try-catch 语句。如下:

const promise = new Promise((resolve, reject) => {
  try {
    foo.bar() // 没有定义 `foo.bar`
    resolve('成功')
  } catch (e) {
    reject(e)
  }
})
promise.then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

这样,即使 Promise 构造函数中出现异常,也能正确地 catch 到并处理。

BUG 2:忘记返回 Promise 对象

在 Promise 中,一定要记得返回 Promise 对象,否则可能导致异常无法被 catch 到,如下:

function doSomething() {
  return new Promise((resolve, reject) => {
    // do something
    resolve('success')
  })
}
doSomething().then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

在这段代码中,doSomething 函数忘记返回 Promise 对象,导致异常无法被 catch 到,控制台也会抛出未捕获的异常。

解决方案:

为了避免这种情况的发生,我们需要在编写 Promise 时,一定要记得返回 Promise 对象。如下:

function doSomething() {
  return new Promise((resolve, reject) => {
    // do something
    resolve('success')
  })
}
doSomething().then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

BUG 3:Promise 忘记执行 reject 方法

在 Promise 中,一定要记得执行 reject 方法,否则可能导致异常无法被 catch 到,如下:

function doSomething() {
  return new Promise((resolve, reject) => {
    // do something exceptional
  })
}
doSomething().then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

在这段代码中,doSomething 函数没有执行 reject 方法,导致异常无法被 catch 到,控制台也会抛出未捕获的异常。

解决方案:

为了避免这种情况的发生,我们需要在编写 Promise 时,一定要记得执行 reject 方法并传递错误信息。如下:

function doSomething() {
  return new Promise((resolve, reject) => {
    // do something exceptional
    reject('exception')
  })
}
doSomething().then((res) => {
  console.log(res)
}).catch((err) => {
  console.log(err)
})

总结

Promise 是一种非常重要的新特性,但是在实际应用中,往往会出现各种各样的 BUG,这就需要我们正确地使用 Promise,并注意捕获异常。在编写 Promise 时,我们需要注意以下几点:

  • 使用 try-catch 语句捕获 Promise 构造函数中的异常。
  • 一定要记得返回 Promise 对象。
  • 一定要记得执行 reject 方法并传递错误信息。

通过以上解决方案,我们可以更好地使用 Promise,并提高代码的健壮性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b757cfadd4f0e0fffe7e3c