如何在创建另一个请求之前等待多个嵌套请求?

Posted

技术标签:

【中文标题】如何在创建另一个请求之前等待多个嵌套请求?【英文标题】:How to wait for a multiply nested requests before creating another requests? 【发布时间】:2020-06-04 20:14:22 【问题描述】:

我有一个刷新控件。当我把它拉下来时,我会发出 2 个这样的嵌套请求:

  httpClient.fetchCurrentWeather(...
    httpclient.fetchAnotherPartOfWeather(...
      delegate.showWeather(...)
    )
   )

我想在调用另一个之前等待第一组完成,因为当我这样做时,我的视图会因为许多回调值更新而闪烁。

更新: 我在交互器中调用:

func retreiveCurrentDailyWeatherForecast() 
        guard let lat = locations?.first?.coordinate.latitude,
            let lon = locations?.first?.coordinate.longitude
            else  return 

        httpClient.fetchCurrentWeather(
            parameters: ["lat": lat,
                         "lon": lon, "units": "metric"],
            completionHandler:  dailyWeatherResult in
                switch dailyWeatherResult 
                case .success(let dailyWeatherResponse):
                    self.httpClient.fetchCurrentHourlyWeather(
                        parameters: ["lat": lat,
                                     "lon": lon, "units": "metric"],
                        completionHandler:  dailyWeeklyHourlyResult in
                            switch dailyWeeklyHourlyResult 
                            case .success(let dailyWeeklyHourlyResponse):
                                let weatherForecast =
                                    self.modelConverter.convertWeatherForecast(dailyWeatherResponse,
                                                                               dailyWeeklyHourlyResponse)
                                self.didRetreieveWeatherForecastFromNetwork(weatherForecast)
                            case .failure(let err):
                                print(err)
                            
                    )
                case .failure(let err):
                    print(err)
                
        )
    

    func didRetreieveWeatherForecastFromNetwork(_ weatherForecast: WeatherForecast?) 
        if let weatherForecast = weatherForecast 
            self.presenter.didRetreiveWeatherForecast(weatherForecast)
        
    

【问题讨论】:

我认为您没有展示足够多的代码,因为您展示的内容会如您所愿。您是否正在执行您在循环中显示多个值的代码? 第二个。你能展示更多你的代码吗?显示全部回调内容。 @rs7,我更新了问题。 @AdamPro13,是的,请看我上面的代码。 @Alexander 更新 UI 并包含在完成处理程序中的语句需要在主线程上执行。哪些功能会更新您的 UI?可能是 didRetrieveWeather.. ? 【参考方案1】:

在这里,您不需要任何太高级的东西。你只需要维护一个Boolean(例如:isRequestIncomplete)来检查是否收到了前一个请求的响应。以下是如何实现此目的的示例:

if isRequestIncomplete  return 
isRequestIncomplete = true
httpClient.fetchCurrentWeather(...
    httpclient.fetchAnotherPartOfWeather(...
      isRequestIncomplete = false
      delegate.showWeather(...)
    )
   )

【讨论】:

您不需要布尔值来检查请求是否完成。完成处理程序是异步执行的。 你如何判断完成处理程序是否被调用? 完成处理程序要么将按顺序执行,要么其中一个将引发错误。所以问题出在其他地方。 @Frankenstein,我想我可以将您的答案标记为解决方案,因为现在我在调用函数时只调用了 2 次这些调用。 我希望你理解我在这里试图传达的逻辑。

以上是关于如何在创建另一个请求之前等待多个嵌套请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Javascript 在发送请求之前等待 Promise?

如何在使用 res.sendFile() 将请求发送回客户端之前等待文件创建完成

在expressJS中如何创建一个缓存,使多个请求等待相同的promise [重复]

如何在一个请求中等待,直到另一个请求完成 nodeJS 中相同功能的执行

如何等待来自嵌套请求的 React 评估值?

如何在执行下一个操作之前等待请求完成(Xcode 11)