Bob*_*ole 5 javascript asynchronous async-await es6-promise
我想在序言中说,我已经查看了很多有关该主题的 stackoverflow 问题,但我本身没有发现任何“重复项”,因为它们都不包含可以解决此特定情况的解决方案。
我主要研究了如何从异步调用返回响应?,关于“异步/等待的承诺”部分将在异步函数内工作,但我正在处理的函数不是异步的,并且是我无法轻易更改的现有代码库的一部分。我无法将函数更改为异步。
关于回调的部分也不起作用,这将在下面进一步解释。无论如何,我会直接回答我的问题:
我正在通过添加异步函数调用来编辑 JavaScript 中的函数(标准函数,而不是异步函数)。我想等到异步调用完成后再从函数返回(因为异步调用的结果需要包含在返回值中)。我该怎么做呢?
我研究了使用回调,这将允许我编写保证仅在异步调用完成后运行的代码。但是,这不会中断原始函数中的程序流程,并且原始函数仍然可以在回调运行之前返回。回调允许我在异步函数之后按顺序执行某些操作,但它不允许我等待异步调用在最高级别完成。
示例代码,不会返回所需的结果:
function getPlayers() {
... other code ...
let outfieldPlayers = asyncGetOutfieldPlayersCall()
... other code ...
allPlayers.add(outfieldPlayers)
return allPlayers // the returned value may or may not include outfield players
}
Run Code Online (Sandbox Code Playgroud)
我面临的实际问题有点复杂 - 我在 for 循环的每次迭代中调用异步函数,并且需要等到所有调用完成后再返回。但是,我想如果我能解决这个更简单的问题,我可以用 for 循环来解决问题。
遗憾的是,以同步方式等待异步代码几乎是不可能的。这是因为 JS 中没有线程(大多数 JS 运行时,但有些 是)。所以代码要么是同步的,要么是异步的。
由于事件循环,异步代码是可能的。事件循环是 javascript运行时的一部分。它的工作原理是保留一堆回调函数,这些函数在事件触发时运行 - 通常是超时事件(可以使用setTimeout())或 IO 事件(当您发出磁盘或 HTTP 请求或用户交互时发生)。但是,这些回调仅在没有其他代码运行时运行,因此仅在程序空闲且所有函数已返回时运行。
这意味着在线程环境中工作的“自旋循环”(您只需运行一个循环,直到另一个线程更改条件)之类的技术不起作用,因为异步代码在自旋循环完成之前不会运行。
更多信息:https://medium.com/front-end-weekly/javascript-event-loop-explained-4cd26af121d4
| 归档时间: |
|
| 查看次数: |
12105 次 |
| 最近记录: |