异步JavaScript回调与递延/承诺

在编写JavaScript时,我们经常需要处理异步代码。这可能是因为我们需要从服务器获取数据,或者我们需要等待用户交互。无论原因是什么,我们必须确保JavaScript不会阻止浏览器的UI线程,并在完成任务后正确处理结果。

在这种情况下,我们可以使用异步编程技术,如回调、递延和承诺来处理异步代码。在本文中,我们将介绍这些技术,并提供示例代码和指导意义。

回调函数

回调函数是一种广泛使用的异步编程技术。它们允许我们在异步操作完成后执行其他代码。回调函数通常作为参数传递给异步函数,以便在异步操作完成时调用它们。

例如,我们可以使用XMLHttpRequest对象从服务器获取数据。以下是一个简单的获取JSON数据的示例:

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

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

在上面的示例中,我们将回调函数传递给getData()函数。当请求成功时,我们使用JSON.parse()解析响应,并将数据作为第二个参数传递给回调函数。如果请求失败,则我们将错误消息作为第一个参数传递给回调函数。

虽然回调函数是一种流行的异步编程技术,但它们也有一些缺点。其中一个主要问题是回调地狱。当我们需要进行多个异步操作时,嵌套多个回调函数会导致代码变得难以阅读和维护。

递延对象

递延对象是Promise API的前身。与回调函数不同,递延对象允许我们处理多个异步操作,而无需嵌套回调函数。

递延对象具有三种状态:待定、已解决和已拒绝。在创建递延对象时,它处于待定状态。当异步操作完成并且我们想要表示成功时,我们可以调用resolve()方法来将递延对象设置为已解决状态。类似地,如果操作失败,我们可以调用reject()方法来将递延对象设置为已拒绝状态。

以下是使用递延对象获取JSON数据的示例:

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

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

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

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

  -----------

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

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

在上面的示例中,我们首先创建了一个新的递延对象deferred。我们使用XMLHttpRequest对象获取数据,并在异步操作完成时调用resolve()reject()方法。

在返回递延对象的同时,我们可以使用该对象的then()catch()方法来处理已解决和已拒绝状态。这样就避免了回调地狱问题,并使代码更易于阅读和维护。

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