我想先说我已经查看了很多关于这个主题的 stackoverflow 问题,但我没有发现任何“重复”本身,因为它们都没有包含可以解决这个特定案例的解决方案。
我主要看How do I return the response from an asynchronous call? ,并且关于“带有异步/等待的 promise ”的部分将在异步函数中工作,但我正在处理的函数不是异步的,并且是我无法轻易更改的现有代码库的一部分。我将无法将功能更改为异步。
关于回调的部分也不起作用,这将在下面进一步解释。无论如何,我会跳入我的问题:
我正在通过添加异步函数调用在 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
}
我面临的实际问题要复杂一些——我在 for 循环的每次迭代中调用异步函数,并且需要等到所有调用都完成后再返回。但是,我想如果我能解决这个更简单的问题,我可以用 for 循环来解决这个问题。
最佳答案
可悲的是,以同步方式等待异步代码几乎是不可能的。这是因为 JS 中没有线程(大多数 JS 运行时,但 some are )。所以代码要么是同步的,要么是异步的。
由于事件循环,异步代码是可能的。事件循环是 javascript 运行时的一部分。它的工作原理是保留一组在事件触发时运行的回调函数——通常是超时事件(您可以使用 setTimeout()
设置)或 IO 事件(当您发出磁盘或 HTTP 请求时,或在用户交互时发生)。但是,这些回调只运行 当没有其他代码在运行时 , 所以只有当程序空闲并且 全部 功能已返回。
这意味着在线程环境中工作的“自旋循环”(您只需运行一个循环直到另一个线程更改条件)之类的技术不起作用,因为异步代码在自旋循环完成之前不会运行。
更多信息:https://medium.com/front-end-weekly/javascript-event-loop-explained-4cd26af121d4
关于Javascript - 在从函数返回之前等待异步调用完成,而不使用回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61377358/