-1

刚刚发现 async JavaScript,我一直在尝试概念化使用它的意义:当要解决一个问题时,我想能够从一开始就说:“这是一个我应该使用 async 的问题JavaScript!”,当然也相反。

我的第一个想法是开始(慢慢地)将所有内容转换为异步,以便在函数之间更好地交错。然后我意识到这种策略有很大的矫枉过正。有很多函数不需要异步,比如

var add = (a,b) => { return a+b;}

所以现在我在想,从概念上讲,异步 JavaScript 的存在主要是为了更好的 I/O 处理。我认为它可能适用的唯一其他领域是长时间运行的脚本,以免阻塞 JavaScript 的单线程。

我应该说“这是异步工作!”的任何/其他地方?

4

2 回答 2

1

有几个用例可以在 javascript 中使用异步逻辑。一个常见的例子是执行 http 请求。正如您已经指出的那样,您不想在等待服务器响应或用户输入时阻止脚本执行。

JavaScript 应用程序强烈使用了所谓的 Promise。一旦它被解决或拒绝,promise 将发出一个事件。另一种可能性是通过回调函数:

console.log(1)
const wait = function () {
  return setTimeout(function() {
    console.log(3)
  }, 50)
}
wait()
console.log(2)

使用承诺的示例:

console.log(1)
const wait = function() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve()
    }, 50)
  })
}
wait().then(() => console.log(3))
console.log(2)

希望这能以某种方式澄清。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

于 2020-12-12T19:05:36.540 回答
1

在 JavaScript 中,只有计划使用本身是异步的 API 才能真正受益async,即它可以“在后台”执行一些非 JavaScript 任务,然后将作业(事件)放在 JavaScript 作业(事件) 队列。这项工作可以是回调或承诺解决方案。

此类 API 的一些示例包括:

最重要的是,async如果您的函数使用await. async不使用的功能await没有多大意义。即使await-less 函数会返回一个 Promise,它仍然不需要声明async

另一方面,如果您使用某个 API 的一些异步行为,那么如果该 API(尚未)公开基于 Promise 的 API,那么 Promisify 该 API 会很有用。例如,下面是 promisify 的常见代码行setTimeout

const delay = ms => new Promise(resolve => setTimeout(resolve, ms));

...所以现在在一个async函数中,您可以引入 100 毫秒的“暂停”:

await delay(100);

如果您正在使用 Promise,并且发现您的代码具有.then链,那么这是转换为async/await语法的一个很好的用例。

于 2020-12-12T19:36:59.413 回答