如何等待所有异步调用完成

感测器

我有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, channel, null, stopLoadingOnVideoId)
  // My code which have to be executed right after videos are loaded
}

我尝试过的每个解决方案最终this.videoIdMap都是空对象或编译问题,因此任何想法都值得欢迎。

EOL

您可以切换到Promise而不是Observables,从而将方法转换为异步方法,只要data具有a ,该方法便会重复出现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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何等待所有异步调用完成

来自分类Dev

你如何等待所有异步调用在Java中完成?

来自分类Dev

AngularJS等待foreach中的所有异步调用完成

来自分类Dev

循环中的所有异步调用完成后,如何调用函数?

来自分类Dev

如何等待所有异步完成?

来自分类Dev

目标C-如何等待异步调用完成

来自分类Dev

如何在嵌套的foreach中继续操作之前确保所有异步调用完成

来自分类Dev

等待多个异步调用完成?

来自分类Dev

如何确定所有异步readFile()调用完成之后

来自分类Dev

如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

来自分类Dev

我如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

等待似乎并没有等到异步调用完成

来自分类Dev

异步调用完成后,回调/关闭如何知道要等待?

来自分类Dev

如何等待大量任意数量的深度嵌套异步jQuery ajax调用完成

来自分类Dev

节点在执行代码之前等待所有异步调用

来自分类Dev

如何等待 API 调用完成然后返回结果?

来自分类Dev

如何等待进行异步调用的.each循环?

来自分类Dev

如何等待异步方法中的等待完成所有执行?

来自分类Dev

如何等待所有NSOperations完成?

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

量角器 - 在执行 expect 之前等待异步调用完成

来自分类Dev

如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

来自分类Dev

等待异步函数调用完成

来自分类Dev

等待多个(异步)API 调用完成

来自分类Dev

如何确保在所有异步函数完成后再次调用间隔函数?

来自分类Dev

仅当来自服务的异步调用完成时,如何调用函数?

来自分类Dev

同步Ajax调用-或:如何等待所有内容加载完成?

来自分类Dev

同步Ajax调用-或:如何等待所有内容加载完成?

Related 相关文章

  1. 1

    如何等待所有异步调用完成

  2. 2

    你如何等待所有异步调用在Java中完成?

  3. 3

    AngularJS等待foreach中的所有异步调用完成

  4. 4

    循环中的所有异步调用完成后,如何调用函数?

  5. 5

    如何等待所有异步完成?

  6. 6

    目标C-如何等待异步调用完成

  7. 7

    如何在嵌套的foreach中继续操作之前确保所有异步调用完成

  8. 8

    等待多个异步调用完成?

  9. 9

    如何确定所有异步readFile()调用完成之后

  10. 10

    如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

  11. 11

    我如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

  12. 12

    如何使Parallel等待所有异步任务完成?

  13. 13

    等待似乎并没有等到异步调用完成

  14. 14

    异步调用完成后,回调/关闭如何知道要等待?

  15. 15

    如何等待大量任意数量的深度嵌套异步jQuery ajax调用完成

  16. 16

    节点在执行代码之前等待所有异步调用

  17. 17

    如何等待 API 调用完成然后返回结果?

  18. 18

    如何等待进行异步调用的.each循环?

  19. 19

    如何等待异步方法中的等待完成所有执行?

  20. 20

    如何等待所有NSOperations完成?

  21. 21

    NodeJS等待所有异步命令完成

  22. 22

    量角器 - 在执行 expect 之前等待异步调用完成

  23. 23

    如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

  24. 24

    等待异步函数调用完成

  25. 25

    等待多个(异步)API 调用完成

  26. 26

    如何确保在所有异步函数完成后再次调用间隔函数?

  27. 27

    仅当来自服务的异步调用完成时,如何调用函数?

  28. 28

    同步Ajax调用-或:如何等待所有内容加载完成?

  29. 29

    同步Ajax调用-或:如何等待所有内容加载完成?

热门标签

归档