Javascript - 在从函数返回之前等待异步调用完成,而不使用回调

标签 javascript asynchronous async-await es6-promise

我想先说我已经查看了很多关于这个主题的 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/

相关文章:

javascript - 异步 - 回调不是函数

c# - 我是否应该将 async/await 添加到单行函数中?

c# - 从 webapi 中的 async DelegatingHandler 读取异步响应内容时出现死锁

javascript - 是否可以从 javascript 重新创建选择?

javascript - 将数组映射到数组的对象内

javascript - Promise.then 作业执行顺序

c# - 任务状态 :Waiting for activation -DownloadStringTaskAsync -WP8

javascript - 如何在 TypeScript 2 中转换为数组?

ajax - Firefox 似乎正在对并行 ajax 请求的成功函数进行排队,可能是因为 setTimeout?

c# - 在锁定中使用异步方法的最佳实践是什么