Angular 2递归http.gets深度未知

2024-01-08

我一直在使用如下所示的模式将 Angular2 中的 http.gets 链接在一起,以从两层深的文件夹(所有伪打字稿)的分层结构中检索信息:

myObservable = this.myService.getSubFolders(topFolderUrl)
    .switchMap(subFolders=> this.myService.getInfoFromSubFolders(subFolders))
    .map(subFolders=> => {
        ...do stuff with subFolders...
        return subFolders;
        }
    );

myService 看起来像这样:

getSubFolders(topFolderUrl): Observable<Folder[]> {
    return this.http.get(topFolderUrl)
        .map(res => {
            let body = res.json();
            let foldersToReturn: Folder[] = [];
            for (let subfolder of body.subFolders) {
                let tempFolder = new Folder;
                tempFolder.url = subfolder.url;
                tempFolder.otherProps = subfolder.otherPropValue;
            }
        return foldersToReturn;
        }
    .catch(this.handleError);
}

getInfoFromSubFolders(subFolders:Folder[]): Observable<Folder[]> {
    let calls: any[]  = [];

    for (let folder of subFolders:Folder){
        calls.push(
            this.http.get(folder.url)
            );

    var subject = new Subject<Folder[]>();       //see: http://stackoverflow.com/a/38668416/2235210 for why Subject

    Observable.forkJoin(calls).subscribe((res: any) => {
        let foundFolder = subFolders.find(folder=> {
                return response.url.indexOf(folder.url)!==-1;
            });
        for (let response of res){
            let bodyAsJson = JSON.parse(response._body);
            foundFolder.otherProps = bodyAsJson.otherPropValue; 
        }
    subject.next(subFolders);
    });
return subject;
}

然后我使用 | 订阅 myObservable我的模板中的异步管道。 myObservable 中的对象最终类似于:

{
  "url": "topFolderUrl", 
  "otherProps": "otherPropsValue", 
  "subFolders": [
    {
      "url": "subFolder1Url",
      "otherProps": "otherPropsValue"
    },
    {
      "url": "subFolder2Url",
      "otherProps": "otherPropsValue",
    }
  ]
}

然而,这依赖于恰好两层深的文件夹结构 - 不多也不少,我有两个相关的问题:

  1. 我如何重构它以允许我递归地处理一系列文件夹n层深 - 我一次只能请求一层 - 即每个子文件夹都有“subFolders”:[]等。
  2. 如果没有子文件夹,我将如何让系统应对?即不从 .switchMap 中的 SubFolders 调用 getInfo

我有一种感觉,这是一个非常常见的场景,因此它可能对很多人有用。

任何指点感激不尽


我认为expand运算符可以在这里为您提供帮助,因为它可以解决此类用例中的递归问题。

请参阅此问题了解更多详细信息:

  • 进行第二次 http 调用并在同一个 Observable 中使用结果 https://stackoverflow.com/questions/38308866/make-a-second-http-call-and-use-the-result-in-same-observable/38308968?noredirect=1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2递归http.gets深度未知 的相关文章

随机推荐

  • 动态列出项目中的所有表单

    我想在列表框中动态列出项目中存在的所有表单的名称 然后通过单击每个表单 在另一个列表框中列出该表单上存在的所有按钮 但我不知道是否可以实施以及如何实施 如果您使用的是 Delphi 2010 您可以使用 RTTI 列出所有已注册 在应用程序
  • 编写软件时 64 位相对于 32 位的优势 [重复]

    这个问题在这里已经有答案了 如果我有一个像 HelloWorld 这样用 C 编写的简单程序 然后我在 32 位和 64 位的机器上编译它 我会得到两个不同的二进制文件做同样的事情 但它们是不同的机器代码 只有 32 位二进制文 件能够在
  • EWS FindItems OrderBy - 按 EmailMessageSchema 排序。来自不正确的顺序

    我正在视图上使用 OrderBy 调用 EWS FindItems 方法 如果我使用各种 ItemSchema 值 例如 ItemSchema DisplayTo ItemSchema Importance ItemSchema Subje
  • 使用 ISABOUT 时可以使用变量吗?

    我正在尝试使用存储过程创建一个表 通过获取主题名称并使用与该主题名称关联的关键字和权重来确定如何对帖子进行排名 从而对帖子进行排名 我一直在尝试使用 CONTAINSTABLE 和 ISABOUT 但在将关键字和权重放入 ISABOUT 语
  • 仅在为模拟器构建时才重复符号

    当为设备 ipad 3 构建时 我的构建工作发现没有警告或错误 但是当为 iPad 或 iPhone 模拟器构建时 我收到如下链接器错误 duplicate symbol CONSTANT NAME in Users me libLibra
  • 将 KDoc 文档从一种方法复制到另一种方法

    对于两个给定的方法 Adds a DataItem to the Android Wear network The updated item is synchronized across all devices fun putItem sa
  • 如何在 UIView 上添加 CCSprite

    在我的 cocos2d 应用程序中 我有一个UIView我通过添加子视图来显示在屏幕上 CCDirector sharedDirector openGLView 但我想知道是否有办法显示CCSprite在此视图之上 因为我必须与这些 CCO
  • 如何在R中查找列的平均值[重复]

    这个问题在这里已经有答案了 这是我正在使用的 csv 文件 my xldataset lt read csv http www math smith edu sasr datasets help csv 这是我尝试查找 mcs1 列的平均值
  • 在 Varnish 正则表达式中提取捕获组内容

    我在 Varnish 配置语言中有以下正则表达式 abc a zA Z0 9 0 9 现在 我想获取值 2部分 即 0 9 Varnish 中的正则表达式 我怎样才能得到这个值 您可以使用regsub在这种情况下 set req url r
  • 我的视图模型值类型属性应该可以为空吗?

    我已经让我的视图模型属性可以为空已经有一段时间了 我的理由是 当进行验证时 我不希望将默认值插入到用户留空的字段中 但这是必需的 当然 我将必填字段标记为必填 但这让我认为这样做会失去对象模型的大量保真度 当然 我的域类只有在实际上可以为空
  • 如何设置 VS Code 项目以构建 LLVM

    我想使用 VS Code 来构建和调试 LLVM 源代码 有没有一个好的文档解释如何在 VS Code 中为 LLVM 设置项目 提前致谢 我发现以下博客很有用 https developers redhat com blog 2021 0
  • 在 ASP.NET Core 中到达控制器之前拦截不良请求

    如果收到的请求是 BadRequest 我有一个应用逻辑 为此我创建了一个过滤器 public class ValidateModelAttribute ActionFilterAttribute public override void
  • 在前端JS中将ajax请求从一个容器发送到另一个容器

    我为 API 和前端使用不同的 Docker 容器 frontend image
  • 如何使用coldfusion获取href值?

  • 在 Windows 上配置 MongoDB

    我正在尝试在 Windows 上设置 MongoDB 但在线文档似乎不太准确 在 配置 Windows 服务 部分下 step 1 http docs mongodb org manual tutorial install mongodb
  • 使用 jQuery 预加载图像

    我正在寻找一种快速 简单的方法来使用 JavaScript 预加载图像 如果这很重要的话我会使用 jQuery 我在这里看到了这个 http nettuts com http nettuts com tutorials javascript
  • 使用 iOS SDK 将视频发布到 Facebook 时出错

    我有一个应用程序 可以使用适用于 iOS 的 Facebook SDK 将本机 MOV 文件 视频发布到 Facebook 它一直运行没有问题 直到几周前它开始失败并出现以下错误 error code 352 message 352 Sor
  • 在亚马逊 lambda python 中运行 selenium webdriver

    我想在amazon lambda中运行BeautifulSoup和selenium webdriver 我的运行环境是python 3 6 可以跑吗 如果是这样怎么办 我的目的是使用 beautiful soup 4 和 selenium
  • AVAudioRecorder 仅录制中断后的音频

    在我使用 AVAudioRecorder 和 AVAudioPlayer 录制和播放音频的应用程序中 我遇到了来电情况下的场景 当录音正在进行时 如果电话来电 则仅录制电话通话后录制的音频 我希望通话后录制的录音是通话前录制的音频的延续 我
  • Angular 2递归http.gets深度未知

    我一直在使用如下所示的模式将 Angular2 中的 http gets 链接在一起 以从两层深的文件夹 所有伪打字稿 的分层结构中检索信息 myObservable this myService getSubFolders topFold