Javascript 在同步函数中调用异步函数

Javascript 在同步函数中调用异步函数,javascript,Javascript,我使用的是JavaScript,我有一个用于拖放的事件挂钩。如果我返回false,则删除操作将中止。在该事件挂钩中,我需要调用异步函数(查找实体),作为我决策的一部分 Hooks.on(“dragdrop”,(上下文,数据)=>{ const pack=context.pack.get(data.packId);//好的,这是同步的 const item=pack.getEntity(data.id);//错误:异步返回承诺,而不是项 如果(item.type==“blah”){//这失败了,因

我使用的是JavaScript,我有一个用于拖放的事件挂钩。如果我返回
false
,则删除操作将中止。在该事件挂钩中,我需要调用异步
函数
(查找实体),作为我决策的一部分

Hooks.on(“dragdrop”,(上下文,数据)=>{
const pack=context.pack.get(data.packId);//好的,这是同步的
const item=pack.getEntity(data.id);//错误:异步返回承诺,而不是项
如果(item.type==“blah”){//这失败了,因为我得到了一个承诺
return false;//拒绝dragdrop操作
}
返回true;
});

我必须让这个钩子(回调)返回一个适当的值(true/false),但是如果我使用ASYNC
函数
getEntity()
我不会得到返回的值,只是一个最终将返回该项的承诺。如何解决这个问题?

一般来说,等待承诺有两种主要方式。第一种方法是异步执行,使用
.then()
等等。这是一个非常好的方法,在大多数情况下都应该使用。然而,在您的特定示例中,如果有东西返回
false
,您打算拒绝拖放,因此您当前的方法需要同步行为,但这会阻塞Javascript的主线程。如果答案很慢或者永远不会到达,那么您的用户将被困在页面上,无法执行任何触发Javascript功能的操作。如果您暂时喜欢这种方法,那么可以使用wait。但是为了等待,您需要在
async
函数中


因此,正如您可能猜到的,您将需要将逻辑与UI事件处理分开。让拖放正常执行,如果答案为false,则撤消事件。或者,执行拖放事件,但在等待答案和答案到达(或超时)时将给定元素置于临时状态,然后完成拖放效果或撤消它。因此,您将需要处理UI事件,该事件将触发一些逻辑处理(如果是处理器密集型处理,则最好由web workers执行),完成后,UI需要处理结果。

不,您不能使用此钩子API来做这件事。这是一个完全同步的API,因此无法解析异步侦听器/挂钩


您可以使用具有异步侦听器支持的自定义EventEmitter使钩子API异步。使用,提供方法

您考虑过使用吗?你想怎么做things@PM77-1似乎OP需要使用同步回调函数,而不是异步回调函数