在 Web 开发中,我们经常需要处理异步任务。在某些情况下,我们可能需要取消正在执行的异步任务。例如,当用户在搜索框中输入文字时,我们需要取消之前的搜索请求并发起一个新的搜索请求。
在过去,实现异步任务的取消比较困难。但是,现在可以使用 @jsenv/cancellation 这个 npm 包来轻松实现异步任务的取消。这个包提供了一个基于 Promise 的 API,可以方便地处理任务的取消。
安装
你可以使用 npm 或者 yarn 来安装 @jsenv/cancellation:
npm install @jsenv/cancellation
yarn add @jsenv/cancellation
使用方式
下面是一个简单的例子,演示了如何使用 @jsenv/cancellation。我们将使用 Promise 对象模拟一个异步任务,然后使用 @jsenv/cancellation 取消任务。
-- -------------------- ---- ------- ------ - -------------- - ---- --------------------- ----- -------- ---------------------------- - ----- ------ - ----- --------------- ------------------ --- ----------------- -- ------------- -- ---------------- ------ - ------ ------ - ----- ----------------------- - --- ------------------------- --------------------------------------------- -------------- -- -------------------- -------------- -- - -- ----------- --- -------------- - ----------------- --- ---- ---------- - ---- - -------------------- - -- --------------------------------
在上面的例子中,我们定义了一个 asyncTask 函数代表异步任务。该函数接受一个 CancellationToken 对象作为参数,用于控制任务的取消。
然后我们使用 cancelableRace 函数来创建一个用于取消 asyncTask 函数的 race。如果 cancellationToken 被 cancel,则 asyncTask 函数会被取消。
最后,我们创建一个 CancellationTokenSource 来控制 cancellationToken 的取消。在例子中,我们在执行 asyncTask 函数后立即调用 cancellationTokenSource.cancel() 来取消任务。
如果 asyncTask 函数未被取消,则其在 5 秒后返回“done”。如果 cancellationToken 被取消,则 asyncTask 函数会抛出 CancelError 异常。我们可以根据异常的 name 属性来判断任务是否被取消。
拓展功能
@jsenv/cancellation 还提供了其他拓展功能,例如通过 CancellationToken 的静态函数 fromTimeout
来定时取消异步任务。
-- -------------------- ---- ------- ------ - ----------------- - ---- --------------------- ----- -------- ---------------------------- - ----- ------------- - ----- ----- ------ - ----- --- ----------------- -- ------------- -- ---------------- --------------- ----- ------------------------------ - ------------------------------------------- - ----- ----- ---------------------------------------------------- ----------------- -- --------- ----- - - ------------- - ---- - - --------- ------ ------ - ----- ----------------------- - --- ------------------------- --------------------------------------------- -------------- -- -------------------- -------------- -- - -- ----------- --- -------------- - ----------------- --- ---- ---------- - ---- - -------------------- - -- --------------------------------
在上面的例子中,我们使用 CancellationToken.fromTimeout 函数来创建一个新的 CancellationToken。该函数会在指定的时间后取消 CancellationToken。
然后我们等待 cancellationTokenAfterSomeTime 被取消。当 cancellationTokenAfterSomeTime 被取消时,控制权将返回到 asyncTask 函数,并且程序会输出“Task is cancelled after 9 seconds”。
总结
@jsenv/cancellation 提供了一种简单且有效的方式来取消异步任务。这个库的 API 很容易使用,而且还提供了一些拓展功能,例如定时取消,使其适用于更广泛的使用场景。你可以在你的项目中试用 @jsenv/cancellation 来提高异步任务的可控性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/5eedb4a9b5cbfe1ea0611320