我有一个已获取对象的缓存.我的函数getListByIds应该返回Observable<Model>.在这个函数中,我需要判断对象是否存在于缓存中(按id判断),如果不存在,则从后端获取它.使用async/await的代码可能是:

public async getListByIds(ids: number[]): Promise<Model> {
  return ids.map(id => {
    let cached = this.cacheService.get(id); // may return undefined
    if (!cached) cached = await this.http.get(baseUrl + '/get/' + id).toPromise();
    return cached;
  });
}

我需要将其转换为RxJS-to Promise()已被弃用,我想学习RxJS.

Edit

让我们假设我想在缓存中存储就绪模型,并且从API中有需要解析的纯JOSN数据.

public async getListByIds(ids: number[]): Promise<Model> {
  return ids.map(id => {
    let cached = this.cacheService.get(id); // may return undefined
    if (!cached) {
      const apiData = await this.http.get(baseUrl + '/get/' + id).toPromise();
      cached = this.parseApiData(apiData);
    }
    return cached;
  });
}

我应该在哪里打parseApiData()

推荐答案

函数如下所示:

import { forkJoin } from "rxjs/observable/forkJoin";
import { of } from "rxjs/observable/of";

public getListByIds(ids: number[]): Observable<Model> {
  return forkJoin(ids.map(
    (id) => {
      let cached = this.cacheService.get(id)
      if (!cached) return this.http.get(baseUrl + '/get/' + id).pipe(
        map(apiData => this.parseApiData(apiData))
      )
      return of(cached)
    }
  )
}

forkJoin等待所有映射的可观察对象完成.

Typescript相关问答推荐

Typescript问题和缩减器状态不会在单击时添加用途.属性'状态和调度'不存在于userContextType类型上'|null'

"@ clerker/nextjs/server没有名为clerkMiddleware的导入成员'

根据另一个属性的值来推断属性的类型

Angular 错误NG0303在Angular 项目中使用app.Component.html中的NGFor

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

在不更改类型签名的情况下在数组并集上映射文字

通过按键数组拾取对象的关键点

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

嵌套对象的类型

在Reaction-Native-ReAnimated中不存在Animated.Value

如果数组使用Reaction-Hook-Form更改,则重新呈现表单

TypeScrip中的类型安全包装类

React router 6(数据路由)使用数据重定向

在TypeScript中扩展重载方法时出现问题

tailwind css未被应用-react

为什么发送空字段?

使用或属性编写无限嵌套的接口

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

将 Angular 从 14 升级到 16 后出现环境变量注入问题