gpt4 book ai didi

javascript - 强制异步函数在没有异步等待的情况下同步

转载 作者:行者123 更新时间:2023-11-30 09:13:12 29 4
gpt4 key购买 nike

我需要强制异步函数同步运行。我的情况真的很复杂,所以我会尽力解释。

我正在开发一个与服务器通信的 Ionic 应用程序。

  • 在这个应用程序中,我正在加载一个由 web 服务生成的 html 页面,使用 createComponent 创建一个新组件,并使用 compileModuleAndAllComponentsAsync。

  • 在webservice发送的这个html中,有一些script标签。这些脚本是其他人制作的自定义 javascript,但它们使用我们创建的函数。例如,我们创建了一个函数“createdByUs”。其他人可以用它制作自定义 javascript(如下示例)。

  • “createdByUs”函数创建于 Ionic 应用程序之前,许多人都使用过它。但它在 ionic 中有另一种行为,该行为是异步的,如果函数之前是同步的,则为事件。

  • 现在我必须为 ionic 应用程序调整此函数,并且由于自定义脚本之前已创建,我必须编辑“createdByUs”。代码运行良好,只是它是异步的,所以自定义代码的其余部分在“createdByUs”结束之前执行

  <!-- our function -->
<script type="text/javascript">
inIonic = true;
function createdByUs(){
if(inIonic){
new Promise(function(resolve, reject) {
setTimeout(() => {
console.log('Promise is created and consumed');
resolve('Promise is created and consumed');
}, 5000);
});
}else{
console.log("nice synchronous code");
}
}
</script>

<!-- custom functions made by other persons I can not modify -->
<script type="text/javascript" id="customScript">
createdByUs();
console.log("other code that must wait for createdByUs");
</script>

因为我不能修改自定义脚本,所以我不能简单地将“cratedbyus”作为异步并在每个地方使用 await。我的问题有解决方案吗?

--- 编辑关于该项目的一些精确度:它是一种“页面编辑器”,我们提供了一个图形界面,以及一个人们可以定义自定义脚本的区域。我正在开发一个可以显示这些页面并且脚本可以工作的应用程序。但是有些函数在 Ionic 中不起作用,所以我必须重新定义它们。为了运行 ionic 代码,我在 createdByUs 中调用了一个在 ionic 中接收的事件。它运行良好,除了事件是异步的,此外,它在 ngfor 中添加 html 元素,当您修改 ngfor 的数组源时,ionic 不会立即创建元素,因此 ngfor 中 html 的生成也是异步的.这是无穷无尽的...

最佳答案

没有。你不能那样做。如果你可以这样做,它会产生各种问题(例如 setTimeout 回调无法运行以实际解决 promise ,因为线程将被阻塞等待 promise ),因此它不能在无论如何,以后都不可能了。


你可能会说

但为什么没有一种方法,其行为类似于非异步函数内部的 await,以便运行的执行上下文被存储,从堆栈中删除,然后稍后当 promise 解决时恢复?

当然可以这样做,但这会破坏函数的运行完成保证,换句话说,这会使每段代码都不确定,这通常是一件坏事 (换句话说:并发修改、乱序执行等)。

但是有一个“全局 await 提议”允许在 async 函数之外的顶层 await 吗?

是的,但这仅限于顶层,而且执行顺序仍然是确定的(所有必需的模块在模块运行之前完成)。

关于javascript - 强制异步函数在没有异步等待的情况下同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57040378/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com