Javascript 强制异步函数同步而不使用异步等待

Javascript 强制异步函数同步而不使用异步等待,javascript,asynchronous,Javascript,Asynchronous,我需要强制一个异步函数同步运行。我的情况很复杂,所以我会尽力解释 我正在开发一个与服务器通信的离子应用程序 在这个应用程序中,我对一个Web服务生成的html页面收费,使用createComponent创建一个新组件,并使用compileModuleAndAllComponentsAsync 在webservice发送的这个html中,有一些脚本标记。这些脚本是由其他人定制的javascript,但它们使用我们创建的函数。例如,我们制作了一个函数“createdByUs”。其他人也可以使用它定

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

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

  • 在这个应用程序中,我对一个Web服务生成的html页面收费,使用createComponent创建一个新组件,并使用compileModuleAndAllComponentsAsync

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

  • “createdByUs”函数是在Ionic应用程序出现之前创建的,很多人都使用过它。但在ionic中它还有另一个行为,如果函数以前是同步的,那么这个行为是异步的

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


inIonic=真;
函数createdByUs(){
如果(电子){
新承诺(功能(解决、拒绝){
设置超时(()=>{
console.log(‘创建并使用承诺’);
解决(“承诺被创建和使用”);
}, 5000);
});
}否则{
log(“漂亮的同步代码”);
}   
}
createdByUs();
log(“必须等待createdByUs的其他代码”);
因为我不能修改自定义脚本,所以我不能简单地将“cratedbyus”设置为异步,并始终使用wait。我的问题有解决办法吗

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

不,你不能那样做。如果您可以这样做,它将产生各种问题(例如,
setTimeout
回调无法运行以实际解决承诺,因为线程将被阻止等待承诺),因此它无法以任何方式完成,将来也不可能


你可能会说

但是,为什么没有一种方法,在非异步函数中的行为类似于
await
,以便存储正在运行的执行上下文,将其从堆栈中删除,然后在承诺解决时恢复

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

但是有一个“全局
await
提案”允许在
async
功能之外的顶层
await


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

否。您不能这样做。如果您可以这样做,它将产生各种问题(例如,
setTimeout
回调无法运行以实际解决承诺,因为线程将被阻止等待承诺),因此它无法以任何方式完成,将来也不可能


你可能会说

但是,为什么没有一种方法,在非异步函数中的行为类似于
await
,以便存储正在运行的执行上下文,将其从堆栈中删除,然后在承诺解决时恢复

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

但是有一个“全局
await
提案”允许在
async
功能之外的顶层
await


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

您可能会造成一些麻烦

按原样运行异步函数,但返回承诺。然后,一旦承诺得到解决,就加载另一个脚本

myPromise.then(() => {
  const script = document.createElement('script')
  script.src = 'path/to/otherScript'
  document.getElementsByTagName('body')[0].appendChild(script)
})

你可以创造一个有点黑客

按原样运行异步函数,但返回承诺。然后,一旦承诺得到解决,就加载另一个脚本

myPromise.then(() => {
  const script = document.createElement('script')
  script.src = 'path/to/otherScript'
  document.getElementsByTagName('body')[0].appendChild(script)
})

您可以返回承诺并使用
Promise。然后(()=>{…})
如果您返回承诺,则必须修改函数在其他地方的使用方式(.then()等)。她说这是不可能做到的…我必须把接下来的所有代码(在我的例子中是“console.log(“其他必须等待createdByUs的代码”);)都放在这里,而且每次调用函数时,你都会这样做。我不能,因为自定义代码可能包含任何内容,如果我将所有自定义代码包装在“then”中并在末尾添加一个“}”),在调用“cretedByUs”之前,自定义脚本中定义的某些函数将无法访问。您可以返回承诺并使用
P