【问题标题】:Can I safely call an asynchronous function at the end of a synchronous function?我可以在同步函数结束时安全地调用异步函数吗?
【发布时间】:2021-12-24 17:43:12
【问题描述】:

我似乎找不到一个直接的答案,因为几乎每个资源都将我的问题反转为“我可以从异步内部调用同步”。我也是出于好奇而询问,目的是了解同步和异步之间的关系。

下面是我所想的一个非常基本的示例,但我过去曾在一些异步和同步元素方面表现不佳,并希望遵循最佳实践。

这些都是我知道可以安全地首先运行的所有功能,因为它们中的大多数都是基于一些系统详细信息(例如日期和时间)的 html 设置。


// Fires from body's onload
function startup(){
   // Begin startup and setup
   makeDivs();
   getDate();
   setUpInputHandlers();
   
   
   // Begin API and Async functions
   startupAsync();
}

async function startupAsync(){
   await callApi();
   await doDataWork();
   // more async functions throughout.
}

希望做任何与异步数据同步的事情,但我希望在我跳转到我的 API 调用并处理 API 数据之前运行一些进程。类似于上述的方法会是一种安全的方法吗?我知道让两家初创公司异步会更容易。

【问题讨论】:

  • 简短回答:是的,完全没问题。 "...理解的意图..." async/await 只是语法糖在 Promises 之上,像 JS 的 class 是其基于原型的继承系统之上的语法糖。如果您想了解 async/await 的工作原理,请查看 Promises。 async/await 只是“隐藏”了所有 .then((arg) => { ... })

标签: javascript asynchronous


【解决方案1】:

如果您希望startup() 在执行其他操作之前执行异步函数callApi()doDataWork(),那么启动也应该是一个异步函数。

async function startup(){
   makeDivs();
   getDate();
   setUpInputHandlers();
   await callApi();
   await doDataWork();
}

await startup()
// then do something afer the async functions finish

如果您想在异步函数运行时执行其他操作,则启动不需要是异步函数。

function startup(){
   makeDivs();
   getDate();
   setUpInputHandlers();
   (async function(){
     await callApi();
     await doDataWork();
   })();
}

startup()
// do something while async operations run

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 2014-06-14
    • 2012-07-25
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    相关资源
    最近更新 更多