【问题标题】:Should I expect this code to block? Any way to make it block?我应该期望此代码阻止吗?有什么办法让它阻塞吗?
【发布时间】:2020-11-22 15:29:36
【问题描述】:

我想从顶层代码调用异步方法,然后遇到类似于下面显示的代码作为如何执行此操作的解决方案。看起来虽然它确实调用了 DoSomething(),但它并没有阻塞,并且下面的代码会在 DoSomething() 返回之前继续运行。

// code...

(async () => await DoSomething())();

// more code...

经过进一步考虑,我相信我确实理解它为什么会这样工作。我想我可以将下面的其余代码包装在 .then() 调用中以获得预期的行为,尽管这似乎并不理想。

是否可以写一个同步方法CallSynchronously(asyncMethodToRun)来同步运行一个异步方法?

注意:我没有找到关于 SO 的问题/答案,具体说明如何做我所要求的,我也没有看到明确表示无法完成的答案。但是,如果有人想将这个问题作为重复问题结束并指出​​其他一些答案,这些答案提供了对我来说非常酷的替代解决方案。我要问的是,如果您所指的答案没有具体说明我所要求的无法完成,那么如果是这种情况,请务必在评论中告诉我。因为如果你不这样做,我会把你吓坏的,哈哈。 :)

【问题讨论】:

  • 异步操作不同步;就是这样,他们不能被强迫同步。不过,您可以在 iife 之前添加await
  • @xxh 谢谢,我理解你的第一句话。不知道你对第二个的意思是什么......甚至不确定 iffe 是否是一个错字?
  • 是的,已更正。
  • 哦,哇,对不起;这里:developer.mozilla.org/en-US/docs/Glossary/IIFE.
  • 哦,这是顶级代码!?是的,不,是时候拿出那个大的.then call :) 有一个关于顶级等待的提议,只是等待它完成并推出。实际上,我现在正在更新我的答案。

标签: javascript react-native async-await


【解决方案1】:

强制异步操作​​同步运行是不可能的。

如果这是可能的,主线程将永远无法完成任何事情。

想得到一个鼠标点击事件,等待它本质上是一个异步操作。

如果这样的操作阻塞了线程,那么点击本身就永远不会被接收到,因为主线程被阻塞了!

关键思想是异步操作只会发生,它并不特别关心程序的执行流程,您的程序也不关心,这就是 async/await 存在的原因。

有时我们必须看看 JavaScript 中的 async/await 到底是什么:一个很好的语法,否则会是回调。 (除了堆栈跟踪,相当于使用.then

实际上,异步函数同步返回一个promise对象。

promise 对象被异步解析

// code...

(async () => await DoSomething())();

// more code...

如果您希望more code 等待对DoSomething 的调用,则只需删除 iife,如下所示:

// code...

await DoSomething();

// more code...

或者,如果块中有额外的代码,您可以在 iife 之前使用await 运算符:

// code...

await (async () => await DoSomething())();

// more code...

(如果函数中有额外的代码,那么您可能可以将其简化为括号)

如果这是顶级代码,您可以将整个东西包装在 iife 中:

// code...

(async () => {
    await DoSomething();

    // more code...
})();

这是迄今为止编写顶级异步代码的最简单方法,也是我个人所做的。

【讨论】:

  • 除非我遗漏了什么,否则我无法执行您的建议,因为我无法在顶级代码中使用 await。我会说我遇到的一个问题是,当我导出时,我似乎无法弄清楚如何导出异步函数。我得到错误。我相信我已经看到其他人这样做了。所以这是我需要问的一个单独问题,但除非你有更多建议......听起来这个问题的答案只是它无法完成。
  • 已更新。异步函数调用后是否需要导出一些东西?
  • 我的意思是我的“最终”导出默认值(或任何你会称之为的......我的 App.js 中的那个)当前不是异步的。当我试图让它异步时,我得到了一个错误。如果我自己没有弄清楚,我稍后会问另一个问题。多年来,我一直是一名全栈 Microsoft 商店开发人员,但几个月前才开始接触 RN,因为 Xamarin 很糟糕,原因与 WPF 很糟糕。
  • 有趣的是,我什至从未接触过 RN,但我了解整个核心 JS 语言。从来不需要知道 RN 来回答这个问题,甚至不确定它是否需要标签。
  • 没错,这更像是一个 javascript 问题,我最初打算用它来标记帖子,但没有(只是添加了它)。很高兴你对这篇文章感兴趣。 :)
猜你喜欢
  • 1970-01-01
  • 2017-09-04
  • 2021-12-12
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多