解决 JavaScript 异步问题 – 通过 ECMAScript 2019 修复 Promises

解决 JavaScript 异步问题 – 通过 ECMAScript 2019 修复 Promises

前言

在 JavaScript 发展的过程中,异步编程已经成为了一项让人无法绕过的技术。因为在过去的开发中,流程控制是通过回调(callback)函数来实现的,而这种方式造成了代码层次深度、逻辑不清晰、错误处理困难等问题,为了解决这些问题,Promises 类型应运而生。

介绍 Promises

Promises,它最初是由 CommonJS 社区提出的一种异步编程风格,2015 年被 ECMAScript 正式采纳。它的目标是提供一种简洁、统一的编程接口来恰当地处理异步编程。Promises 是用来解决语言上的异步缺陷的,这些异步缺陷在 callback 方式下尤为明显。

Promises 承诺绑定一个异步操作并且可以链式调用,当一个异步操作完成时,该 Promises 实例会返回成功,并传入回调函数的参数来改变该实例的状态,从而触发下一个异步操作,如果出现异常则触发错误回调函数。这样一来,开发者的代码层级结构就简洁了许多,逻辑也更加清晰易懂。

示例代码:

--- ------- - -------- -- -
    ------ --- ----------------- ------- -- -
        ------------- -- -
            ----------------
        -- -----
    --
-

--- ------ - -------- -- -
    ------ --- ----------------- ------- -- -
        ------------- -- -
            ------------
        -- -----
    --
-

---------
    ------------ -- -
        -----------------      -- -- ----
        ------ ---------
    --
    ----------- -- -
        ----------------       -- -- --
    --

上面的代码中,可以看到我们创建了两个 Promise 实例,分别为 getName 和 getAge。这两个 Promise 实例都是进行异步操作,并返回了一个 Promise 实例。我们使用 Promise 的 then 方法来链式调用操作并解决了异步问题。

Promises 的缺点

尽管 Promises 解决了异步问题,但在某些情况下,使用它们也可能会导致一些问题。作为一个新手开发场景可能还不能完全地感知到,但随着开发中逐渐熟练,会感到其缺点更加明显。

Promise 中的 catch

在 Promise 没有返回语句的情况下,如果异步操作失败,将自动执行 catch 语句。但是,如果执行返回语句并抛出了一个错误,则 catch 将无法捕获到该错误。

示例代码:

--- ------- - -------- -- -
    ------ --- ----------------- ------- -- -
        ------------- -- -
            ---------------
            -------
        -- ------
    ---
--

---------
    ------------ -- -
        ---------------------- ------
    --
    ------------ -- -
        -------------------- -----  -- ------
    ---

上面的代码中,由于使用了 return 语句并且抛出了一个错误,因此 catch 语句无法通过该错误。

在 ECMAScript 2019 中,try-catch 可以保证执行到 catch 方法。我们可以使用 try-catch 来捕获 Promise 中抛出的错误:

代码:

--- ------- - -------- -- -
    ------ --- ----------------- ------- -- -
        ------------- -- -
            --- -
                ----- --- --------------
            - ----- ----- -
                ------------
            -
        -- ------
    ---
--

---------
    ------------ -- -
        ---------------------- ------
    --
    ------------ -- -
        -------------------- -----  -- -- ----- ------ ----
    ---

这种解决方案使用了 try-catch,当在 Promise 中抛出错误时,catch 会成功捕获到该错误并返回错误信息。

结论

Promises 类型的引入改变了我们编写 JavaScript 程序的方式,解决了回调地狱中流程控制的问题。但它本身也存在一些缺陷,如内部的 catch 方法无法捕获错误。ECMAScript 2019 引入了 try-catch 语句,这使我们在使用 Promises 时更加的安全,能够更好的处理错误。

总之,ECMAScript 2019 中针对 Promises 的扩展,加强了 JavaScript 的异步技术,让我们能够更好地解决与异步编程相关的问题。如果想让代码变得更清晰、更容易理解、良好的可维护性和容错性,那么 Promises 是解决异步问题的明显选择。

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