【问题标题】:How to return data to client as I get it from an external api?当我从外部 api 获取数据时,如何将数据返回给客户端?
【发布时间】:2020-01-02 12:32:35
【问题描述】:

我有一个应用程序,我在节点中有一个后端。假设有一个 API 端点 (/get_menu) 来获取所有菜单。
当 app 调用 /get_menu 时,我会调用不同餐厅的外部 API,当它们都返回菜单时,我会将其发送给 app。我为此使用 Promise.all。

由于某些餐厅需要花费大量时间,因此我想将数据返回到应用程序,因为我不断从餐厅 API 获取数据。例如,如果他们中的两个立即返回他们的菜单,那么我将这两个返回给应用程序,然后当我不断获取其他 API 的数据时,我不断将其发送到应用程序。

使用单个 API 端点(即 /get_menu)有哪些好的方法可以做到这一点?

【问题讨论】:

  • 可能不用Promise.all ?

标签: javascript android node.js api


【解决方案1】:

有几个解决方案

  1. 为了给你所问的字面答案,你可以使用一些 像 socket.io 这样的套接字的实现,以将数据发送到您的客户端 随时随地。

  2. 第二个选项是将餐厅的菜单保留在 一个数据库并从那里为用户服务。在后台, 定期使用 cron 更新您的数据库。这不是真的 建议让您的用户等待,直到您的所有菜单 API 完成 解决了。​​

【讨论】:

    【解决方案2】:

    我建议为此使用基于 redis 的队列机制。您可以将每个 API 作为作业推送到此队列中。

    有一个非常好的基于redis的队列npm包Bull。当作业处理完成时会通知一些事件。然后,您可以在作业完成后将数据发送回应用程序。

    【讨论】:

      【解决方案3】:

      在使用 UUID(请求服务器获取菜单列表的唯一 ID)的客户端 javascript 上实现 web worker

      然后,服务器将创建一个数据库条目,为各种远程 api 请求分配一个唯一的 ID。然后,node.js 立即将请求 ID 列表发送回客户端并呈现。获取菜单的后台任务是单独运行的,每次输入结果时,它都存储在数据库中。客户端 Web Worker 将定期请求它需要的 UUID 列表,服务器将使用已响应的 UUID 进行响应。数据一旦发送到客户端就会被删除,客户端会呈现结果并从其请求列表中更新该 uuid 以检索数据......

      它本质上是一个粗略的不可靠结果队列,只要您的服务器能够跟上所有请求,它就可以安全运行。

      另请参阅 Internet 上的“事件源”。

      如果您的主机非常可靠,则更现代的版本涉及使用 websockets 和 websocket 服务器的类似实现。

      【讨论】:

        猜你喜欢
        • 2017-04-02
        • 2023-02-15
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多