2017-08-24 83 views
-3

我正在使用表格/网格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()是第三方库的参数,我我无法改变它的返回值,接受一个承诺或改变的方法是异步

+1

可能重复[如何从异步调用返回响应?](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-呼叫) – Erazihel

+0

总之,你不会得到数据。回报发生在不同的事件中,因此您在返回时没有数据。 – bhspencer

回答

0

的第一件事要做的就是扫描你正在使用的库的开发者文档,看看它是否提供了一个不同的接口,用于异步返回数据(可能通过回调或承诺)。

如果您必须提供的接口期望获得同步结果并且不是为异步结果构建的,则不能使用异步获取结果的函数。这只是一个不匹配,不能完成。

我有时看到可行的唯一解决方法是提前获取异步数据,将其保存在本地,并且只有在已有数据时才启动其他操作。然后你可以提供一个同步回调来提供数据(因为它已经在本地缓存了)。显然,这是否可行取决于情况的细节(通常不可行,因为数据未提前知道)。

另一个更激烈的解决方法是,从字面上重写一个调用库的一部分,为其添加一个异步接口,以便您可以返回一个承诺,并且库将适当地使用该承诺。将接口转换为异步有多困难取决于调用者正在做什么以及如何构建。有些时候它很简单,有些时候它有一个完整的体系结构,这使得很难在没有大量重写的情况下在中间插入异步操作。

+0

感谢您的答案。我倾向于“激烈”的解决方案 - 修补我正在使用的图书馆。希望它不是兔子洞:) –