我正在使用一个表/网格js库,它允许我给它一个函数,在用户右键单击时调用该函数以在菜单中显示一些数据。函数的返回类型为Array<String>
。但是,我想在我的函数中执行异步操作(从网络请求加载数据)并在函数返回值中使用其结果。我怎么能通过回调或其他方式做到这一点?
function getMenuItems(): Array<string>{
const resp: Promise = asyncLoadData()
//How can I use this async construct in my sync function???
const items = ... //e.g. map resp into my return value.
return items
}
要清楚,getMenuItems()
是第三方库的参数,我不能更改它的返回值以接受承诺或将方法更改为异步
答案 0 :(得分:0)
要做的第一件事就是搜索您正在使用的库的开发人员doc,看看它是否提供了一个不同的接口,用于异步返回数据(可能是通过回调或承诺)。
如果您必须提供的接口期望同步结果并且不是为异步结果构建的,那么您不能使用异步获取其结果的函数。那里只是一个不匹配而且无法完成。
我有时看到的唯一可行方法是提前获取异步数据,将其保存在本地,只在已有数据时才启动其他操作。然后,您可以提供将提供数据的同步回调(因为它已经在本地缓存)。显然,这是否可行取决于具体情况(通常不可行,因为数据未提前知道)。
另一个更激进的解决方法是从字面上重写一段调用库以向其添加异步接口,以便您可以返回一个promise,并且库将适当地使用该promise。将接口转换为异步的难度很大程度上取决于调用者正在做什么以及如何构建它。有时这很简单,它有一个整体架构,很难在中间插入异步操作而不需要大量重写。