使用 ES9 的异步迭代不断轮询终生服务

阅读时长 5 分钟读完

随着互联网的快速发展,我们现在常常需要与服务器进行长时间的通讯,获得实时更新。但是很多时候,服务器端还没有足够的数据进行响应,我们需要不断地轮询服务器,等到数据准备好之后再进行响应。

在过去,这种方式需要使用回调函数和定时器来完成。但是在 ES9 中,新增了异步迭代器,它可以帮助我们轻松地实现不断轮询的功能。

什么是异步迭代器?

异步迭代器是一种新的迭代器类型,允许我们在异步任务中进行迭代操作。前面的异步任务必须完成,才能取得下一个值。它可以通过 for-await-of 循环进行使用。

异步迭代器的使用

为了使用异步迭代器,我们需要创建一个 Symbol.asyncIterator 的迭代器。

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

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

接下来,我们可以使用 for-await-of 循环来遍历这个异步迭代器。

在这个例子中,fetchData 函数会无限期地从服务器获取数据,并且当数据到达时通过 yield 关键字返回数据。当 for-await-of 循环被调用时,它会自动等待 fetchData 函数完成,然后获取从 yield 返回的数据。

在长连接服务中使用异步迭代器

让我们将这个例子应用到一个实际的场景中,我们需要在本地中维护一个到服务器的长连接。当新的数据到达时,服务器会在服务器上触发一个事件。为了获取这些新的数据,我们需要不断地轮询服务器。

在 ES9 中,可以使用异步迭代器来完成长连接轮询的任务。接下来,我们将创建一个示例的 WebSocket 客户端,用于演示如何在长连接中使用异步迭代器。

假设我们的 WebSocket 客户端代码如下:

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

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

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

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

我们可以使用异步迭代器来轮询服务,代码如下:

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

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

---------

在这个例子中,我们创建了一个 createWebSocketAsyncIterable 函数,它返回一个异步迭代器,用于从 WebSocket 服务器获取消息。createWebSocketAsyncIterable 函数监听 WebSocket 的 message 事件,然后返回一个 Promise,以便在消息到达时解决。通过 yield 关键字,createWebSocketAsyncIterable 函数可以暂停相应的迭代器,并且在下一次迭代中继续。

接下来,我们使用 for-await-of 循环迭代 createWebSocketAsyncIterable 函数。当新的数据被接收时,for-await-of 循环会自动调用 createWebSocketAsyncIterable 函数,以便在下一个消息到达时恢复迭代。

结论

异步迭代器是一项非常强大的功能,可以简化异步迭代操作的编码方式。它使开发人员能够轻松地进行长连接轮询,而不必使用复杂的回调函数和计时器。

使用 ES9 的异步迭代器是一种非常好的编码方式。它使开发人员能够使用简单的代码来完成复杂的异步任务。如果你还没有使用异步迭代器,那么现在就是时候去试试了!

示例代码

完整代码示例可以在以下链接中找到:GitHub 示例代码

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675251c78bd460d3ad92dbbd

纠错
反馈