【问题标题】:Angular cache http in local storage本地存储中的 Angular 缓存 http
【发布时间】:2020-01-13 14:50:03
【问题描述】:

在 Ionic 4 Angular 8 项目中,我尝试在调用 API 之前获取存储中的信息。

这是我的代码

public getData(id) {
    return this.storage.get(id).then(
        content => {
            if (content == null) {
                return this.getObject(id).subscribe(
                    result => {
                        return result;
                    }
                );
            } else {
                return content;
            }
        }
    );
}

如何调用函数“getData”?

myService.getData(id).then

这个返回字符串或者observable我应该订阅,这两种情况如何处理?

【问题讨论】:

  • 使用 RxJS 中的 of 运算符将您的字符串放入 Observable 中,以标准化您的方法调用。此外,你应该在你的方法上加上一个返回类型并使用 RxJS Observable 而不是 promise。

标签: angular rxjs ionic4


【解决方案1】:

如果您使用的是 RxJS 6,我建议您将 promise 转换为 observable(使用 from 运算符),然后使用可管道运算符处理后续操作,例如 tapswitchMap ,取决于您的方法所需的行为。在这种情况下,我们可以使用 switchMap,因为我们返回的是一个 observable。

import { from } from 'rxjs';
import { switchMap } from 'rxjs/operators';

getData(id) {
  return from(this.storage.get(id))
    .pipe(
      switchMap(content => {
        if (content === null) {
          return this.getObject(id);
        } else {
          return of(content);
        }
      }),
    )
}

从那里,您可以订阅 getData 并返回 observables。

myService.getData(id).subscribe((res) => {
  // do the rest here
})

【讨论】:

    【解决方案2】:

    您正在寻找这样的东西?

    public getData(id): Observable<any> {
      return this.storage.get(id)
        .then(content => {
          if (content === null) {
            return this.getObject(id);
          } else {
            return of(content);
          }
        }
    }
    

    然后你就可以这样称呼它了:

    myService.getData(id).subscribe(console.log);
    

    更新

    你可以试试这个吗?

    getData(id): Observable<any> {
      return Observable.fromPromise(this.storage.get(id)).switchMap(content => {
        if (content === null) {
          return this.getObject(id);
        } else {
          return of(content);
        }
      })
    }
    

    【讨论】:

    • 感谢您的回答。我复制了您的代码并收到此错误:“TS2740:类型'Promise>'缺少类型'Observable'中的以下属性:_isScalar、source、operator、lift 和另外 6 个。”
    • 我更新了我的代码,替换了三元 if。它会给你同样的错误吗?
    • 我更新了我的帖子。请检查。我在this post 找到了这个
    • TS2339:“typeof Observable”类型上不存在属性“fromPromise”。但是,如果我在您之前的代码和链上删除“Observable”并链接 .then 和 .subscribe 它也可以正常工作
    • 好的!我不习惯 Promise(:如果您的问题解决了,请随时编辑我的帖子,添加工作代码 :)
    猜你喜欢
    • 2016-07-08
    • 2019-04-29
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 2017-08-04
    • 2019-09-06
    • 2013-11-30
    相关资源
    最近更新 更多