如何解决如何等待所有异步调用完成
我有NestJS应用程序,可与YoutubeAPI交互并从中加载视频。
一种特定的方法很重要,下面是loadVideos
。它本身具有多个异步方法,一旦一切完成,我需要使用videoIdMap
属性
private loadVideos(
playListId: string,channel: Channel,nextPageToken: string,stopLoadingOnVideoId: string,) {
const baseUrl = YoutubeService.VIDEO_URL_SNIPPET_BY_ID + playListId;
const response = this.httpService
.get(nextPageToken ? baseUrl + '&pageToken=' + nextPageToken : baseUrl)
.pipe(map((response) => response.data));
response.subscribe((data) => {
data.items.forEach((item) => {
if (stopLoadingOnVideoId && item.snippet.resourceId.videoId === stopLoadingOnVideoId) {
return;
}
this.prepareVideoEntity(item.snippet,channel).then((partialVideo) =>
this.videoService.create(partialVideo).then((video) => {
this.videoIdMap[video.youtubeId] = video.id;
}),);
});
if (data.nextPageToken) {
this.loadVideos(
playListId,channel,data.nextPageToken,stopLoadingOnVideoId,);
}
});
}
对我来说,理想的解决方案是使loadVideos
以某种方式异步,以便我以后可以这样做:
public methodWhichCallLoadVideos(): void {
await loadVideos(playListId,null,stopLoadingOnVideoId)
// My code which have to be executed right after videos are loaded
}
我尝试过的每个解决方案最终都以this.videoIdMap
为空对象或出现编译问题,因此任何想法都值得欢迎。
解决方法
您可以切换到Promise而不是Observables,从而将方法转变为只要data
具有nextPageToken
就会重复发生的异步方法:
private async loadVideos(
playListId: string,channel: Channel,nextPageToken: string,stopLoadingOnVideoId: string,) {
const baseUrl = YoutubeService.VIDEO_URL_SNIPPET_BY_ID + playListId;
const response = await this.httpService
.get(nextPageToken ? url + '&pageToken=' + nextPageToken : url).toPromise();
const { data } = response;
for (const item of data.items) {
if (stopLoadingOnVideoId && item.snippet.resourceId.videoId === stopLoadingOnVideoId) {
continue;
}
const partialVideo = await this.prepareVideoEntity(item.snippet,channel);
const video = await this.videoService.create(partialVideo)
this.videoIdMap[video.youtubeId] = video.id;
}
if (data.nextPageToken) {
await this.loadVideos(
playListId,channel,data.nextPageToken,stopLoadingOnVideoId,);
}
}
然后在呼叫者中,您只需等待loadVideos(...)
:
private async initVideoIdMap(...) {
await this.loadVideos(...);
// this.videoIdMap should be correctly populated at this point
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。