【问题标题】:Using a promise in a synchronous function在同步函数中使用 Promise
【发布时间】:2017-08-25 04:35:37
【问题描述】:

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

【问题讨论】:

标签: javascript asynchronous promise


【解决方案1】:

首先要做的是搜索您正在使用的库的开发人员文档,看看它是否提供了不同的接口,该接口旨在异步返回数据(可能通过回调或承诺)。

如果您必须提供的接口需要同步结果并且不是为异步结果构建的,那么您不能使用异步获取其结果的函数。那里只是不匹配,无法完成。

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

另一个更彻底的解决方法是从字面上重写调用库的一部分,为其添加一个异步接口,这样您就可以返回一个 Promise 并且库将适当地使用该 Promise。将接口转换为异步的难度在很大程度上取决于调用者在做什么以及它是如何构建的。有时它很简单,有时它有一个完整的架构,很难在中间插入异步操作而不进行大量重写。

【讨论】:

  • 感谢您的回答。我倾向于您的“激进”解决方案-修补我正在使用的库。希望它不是兔子洞:)
猜你喜欢
  • 2019-10-11
  • 2020-08-13
  • 2019-04-01
  • 2013-06-05
  • 2020-01-22
  • 1970-01-01
  • 2018-01-19
  • 2018-01-15
  • 2018-01-02
相关资源
最近更新 更多