繁体   English   中英

何时使用 ES2017 内置的“异步”或导入“npm i async”

[英]When to use 'async' built-in for ES2017 or import 'npm i async'

我最近了解到 ES2017 中内置了 async/await,但我已经做了几个项目,我需要 package异步才能使用 async/await。

有没有一种简单的方法来判断我何时可以正常访问异步或何时需要导入它? 我是否需要使用 npm package? 如果现在语言中内置了完全相同的功能,那么异步 package(目前每周显示 47,469,002 次下载)的目的是什么?

对于需要异步的示例项目,请随意查看 MDN 上的Local-Library MongoDB/Express/Node 教程项目。

由于这是一个 Express 应用程序(就像我自己的几个应用程序一样),这与 ExpressJS 有什么关系吗?

我环顾四周试图找到这些答案,但空手而归。 任何理解这一点的帮助表示赞赏。

NPM 上的async库提供了许多用于管理异步操作的实用函数。 这与允许您将await与 promise 一起使用的语言中的async关键字非常不同。 这些就像猫和狗。 它们都与异步编程有关,但除此之外,它们根本不是一回事。

例如,假设您需要向特定主机发出 1000 个单独的请求,但由于各种原因(内存消耗、主机的速率限制等),您对正在运行的目标主机的请求不能超过 5 个在任何给定时间。 因此,您想启动 5 个请求,然后每次完成一个请求,您将启动另一个请求,直到最终完成所有 1000 个请求。

ES7 中的async关键字也许可以用在一些自定义代码中来实现我上面描述的算法,但它本身并没有给你那个解决方案。

而来自 NPM 的async库在其工具包中有一个特定的 function 用于执行我所描述的操作。 它称为parallelLimit() ,它可以让您准确指定一次要并行的操作数(仅此而已)。 事实上, async库包含用于管理异步控制流的各种实用函数,您可以在此处查看它们的完整列表: https://caolan.github.io/async/v3/docs.html#parallelLimit

现在我们在语言中有了async关键字,其中一些算法不再需要,因为用纯 ES7 编写它们非常容易。 例如,如果您想一次遍历一个数组,对每个项目调用异步 function,您可以只使用for循环和await ,所有这些都在async function 中。

async function run() {
    for (let x of myArray) {
         await doSomeAsyncOperation(x);
    }
}

在我们在 ES7 中使用asyncawait之前,您将不得不编写一些自定义代码来执行此异步、序列化迭代,或者您将使用来自诸如async库之类的库中的预构建 function。

概括

回顾一下, async库包含许多用于管理异步操作的实用程序函数。 由于 ES7 中asyncawait提供的控制流选项,其中一些不再需要,即使存在asyncawait ,有些仍然有用/有用。

仅供参考, async库最初是在 Javascript 中的 promise 和async/await之前开发的,它处理使用普通回调来表示完成或错误并提供管理它们的实用程序的老式异步操作。 Promise 和async/await已经取代了对async库中某些功能的需求,但不是全部。

何时使用 ES2017 内置的“异步”或导入“npm i async”

使用内置的 ES7 async/await直接简单的解决了你需要解决的异步控制流问题。 当您无法仅使用async/await轻松解决问题并且async库包含一个预构建的 function 可以直接简单地解决您的问题时,请使用异步库中的 function。

因此, async库只是 NPM 上数十万个库之一。 当它包含比已经内置在语言中更好的帮助您解决工作的内容时,您可以使用它,与何时使用 NPM 中的任何其他模块的逻辑相同。

作为 ES2017 一部分的 aysnc/await 通过避免 promise 链来实现更简洁的风格。 请参阅 mdn 中提到的以下示例。 您避免 promise 链,然后捕获并具有异步行为https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

您提到的异步库更像是一个实用程序(它们主要设计用于节点 js),它采用回调数组,执行并包装它们并为您提供 promise。 Iy 还为您提供更多功能,例如,如果您想要并行、串行、链接回调调用回调,则通过常见的成功/错误处理来帮助跟踪这些

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM