如何在创建另一个请求之前等待多个嵌套请求?
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 [重复]