【问题标题】:Possible to get response of each API calls inside ForEach without waiting to end of loop?可以在不等待循环结束的情况下获得 ForEach 中每个 API 调用的响应吗?
【发布时间】:2021-09-11 14:44:18
【问题描述】:

我需要在 ForEach 循环中返回每个 API 调用的响应,而不是等待它结束。

第一个 Api 从 SharePoint 获取数据并调用另一个 Api 来更新网站数据库:

[HttpGet]
[Route("GetAllFaqs")]
public async Task<ApiResult<List<FaqModel>>> GetAllFaqs()
{
    ApiSuccessResult<List<FaqModel>> faqs = await sharepointConnector.GetAllFaqsAsync();

    foreach (var faq in faqs.Response)
    {
        // Here I want to return response of this Api call 
        // so I could show on client side one by one
        await UpdateFaq(faq); 
    }

    return faqs;
}

另一个更新网站数据库的 API:

[HttpPost]
[Route("UpdateFaq")]
public async Task<ApiResult<FaqSyncResult>> UpdateFaq(FaqModel model)
{
    ApiSuccessResult<FaqSyncResult> result = await websiteConnector.SyncFaq(model);

    return result;
}

是否可以在 ForEach 循环中返回响应而不停止它并且也无需等待结束?

【问题讨论】:

    标签: c# api asynchronous .net-core


    【解决方案1】:

    这通常不是它的工作方式。

    有两件事会阻止您使用这种方法:

    • 大多数用于获取数据的 javascript 库都在等待 api 的完整响应
    • 大多数用于处理数据的 javascript 库都可以处理完整的数据集

    获得此行为的另一种方法是使用 HTTP2/websockets 或 SignalR 将数据从服务器推送到客户端。

    我已经多次实现了 SignalR 变体,并且效果非常好。 Here is an example on of chat application

    它的工作方式基本上是通过集线器将数据发送到客户端(通过 SignalR 库连接)并使用适当的数据客户端调用一段 javascript。

    但是,我必须警告您,这将打破 API 的“通用”理念,因为它严重依赖于客户端以这种方式接受数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 2020-11-01
      • 1970-01-01
      • 2017-07-21
      • 2015-04-19
      • 2019-02-26
      • 2019-10-15
      • 2022-01-16
      相关资源
      最近更新 更多