Arm*_*lix 0 javascript asynchronous node.js async-await es6-promise
我开始学习异步 Javascript,但我真的很困惑。
老实说,异步/等待方法对我来说似乎非常合乎逻辑。我们需要让运行时知道我们正在执行异步操作,以便它可以相应地处理它。但是为什么我们在使用 .then() 方法时不需要做同样的事情呢?我的意思是,如果 Javascript 已经能够理解何时处理 Promise,那么是否不能像 .then() 一样在没有异步的情况下使用 wait ?
更令人困惑的是,我看到人们直接在使用 async 关键字声明的函数内使用 .then() 。async/await 不应该是 .then().catch() 方法的语法糖吗?为什么它们可以组合在一起,尤其是相互组合在一起?对异步函数的结果使用 .then() 不会那么令人困惑,但彼此内部让我更难理解这一点。
我确实到处寻找对此的解释,但找不到这个确切问题的答案。我发现人们说你可以使用这两种方法,因为它们本质上是同一件事,但当你了解细节时,事情并不是很清楚。
所以 async 函数总是返回一个承诺。在其中,await 总是处理承诺。.then() 可以链接到await 函数。.then() 也可以链接到异步函数的结果。如果我们不想在等待上使用 try/catch ,则与 .catch 方法相同。为什么这么混乱?我们可以在没有 .then() 的情况下处理异步返回吗?如果 async/await 确实是 .then() 的语法糖,为什么 .then() 在解析后也不总是返回一个 Promise?
如果有人可以帮助澄清,我将不胜感激。谢谢你!
这里有很多问题,但一种思考方式是...... Promise 不是异步操作,它们只是一种标准模式,可以帮助用户以可预测的方式处理现有的异步操作。
没什么特别的.then()。它不是 Javascript 关键字,并且 javascript 不需要以任何方式“意识到”then。
承诺是一种模式。您可以从头开始自己编写一个 Promise 类(我强烈推荐这个)。当您使用.then()并向其传递一个函数时,您是在告诉 Promise 类:“当 Promise 解析时,请为我调用此函数”。
所有这些都在 async/await 之前存在。之后添加了 Async/await,以便更轻松地使用 Promise。
我发现“某物是语法糖”这个问题毫无意义。这表明语言功能没有那么有意义,因为在语言功能存在之前就可以完成同样的事情。虽然这可能是正确的,但与汇编语言相比,这对于任何编程语言都是正确的。对我来说,“语法糖”的定义可以扩展到几乎任何东西,所以它不是一个有用的名称。
async/await(以及之前的生成器)添加到该语言中的是,JavaScript 函数可以在某些条件后被中断和恢复。
最后,.then()始终.catch()回报承诺。如果您看到一个.then()不兼容的函数,那么它与 Promise/A+ 规范不兼容。
如果你愿意付出努力来充分理解这一点,我会推荐以下两个练习:
coasync/await 落地之前如何完成此操作的包)| 归档时间: |
|
| 查看次数: |
3537 次 |
| 最近记录: |