在 ECMAScript 2019 中,新增加的一项特性叫做标准化取消标记(standardized and stable support to cancel promises)。
这项特性的作用是优化 JavaScript 代码中的控制流程。在以往的版本中,我们经常使用 Promise 或 async/await 解决异步请求问题。但是,如果我们需要在某些条件的情况下,终止正在进行的异步操作,就需要利用取消标记来完成。
在 ECMAScript 2019 中,取消标记已经成为了标准的 API,它提供了一种更加优雅的方式来取消异步操作。
如何使用?
使用取消标记,需要引入一个新的 API——AbortController
与 AbortSignal
。
第一步,我们需要创建一个 AbortController 实例,这个实例可以控制一个或多个异步操作的执行状态。
const controller = new AbortController();
第二步,在异步操作中,我们需要关联这个 AbortController
实例。每个 AbortController
实例都有一个signal
属性。它是一个 AbortSignal
实例,可以作为异步操作的第二个参数传入,与 Promise 的 resolve
和 reject
参数类似。
-- -------------------- ---- ------- ---------- - ------- ----------------- ---------------- -- - ----- -------------- -- - -- ----------- --- ------------- - ------------------ ---------- - ---- - ------------------ ------- ------- - ---
在这个 fetch 的例子中,我们将 controller.signal
作为 fetch 方法的第二个参数传入,表示这个异步操作可以被取消。
第三步,我们需要在异步操作中,主动调用 controller.abort()
方法来取消异步操作。
setTimeout(() => { controller.abort(); }, 5000);
在这个例子中,我们将控制器的 abort()
方法放在 setTimeout()
的回调中。这样,5秒钟之后,异步操作就会被取消。
取消异步操作的优势
取消标记 API 有以下优点:
- 更加优雅的代码,同时能够解决异步操作相关的问题。
- 可以有效地管理应用程序的资源,避免无谓的资源消耗。
- 在一些场景下,我们可以更好地控制程序的执行流程。比如说,在大量请求屏幕上显示之前,我们可以取消屏幕请求。
Tips
在使用
AbortController
的时候,一定要注意确保你的代码逻辑没有利用settimeout()
或者setinterval()
来处理未完成的请求。如果有的话,这些请求不能被正确的取消。除了利用
Promise.race()
来完成多个异步任务以外,我们还可以使用Promise.all()
完成多个异步任务。
结论
标准化取消标记是 ECMAScript 2019 中新增加的一个特性,它可以优化 JavaScript 代码中的控制流程,避免出现过度等待或资源不足的情况。在尝试使用标准化取消标记的过程中,请注意谨慎使用,确保你的代码逻辑没有利用 settimeout()
或者 setinterval()
来处理未完成的请求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672d6038ddd3a70eb6da3c36