Angular 本地存储中的角度缓存http

Angular 本地存储中的角度缓存http,angular,rxjs,ionic4,Angular,Rxjs,Ionic4,在Ionic 4.8项目中,我尝试在调用API之前获取存储中的信息 这是我的密码 public getData(id) { return this.storage.get(id).then( content => { if (content == null) { return this.getObject(id).subscribe( result => {

在Ionic 4.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

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

您正在寻找类似的内容

publicGetData(id):可观察{
返回此.storage.get(id)
。然后(内容=>{
如果(内容===null){
返回此.getObject(id);
}否则{
归还(内容);
}
}
}
然后,您可以这样称呼它:

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

你能试试这个吗

getData(id):可观察{
返回Observable.fromPromise(this.storage.get(id)).switchMap(content=>{
如果(内容===null){
返回此.getObject(id);
}否则{
归还(内容);
}
})
}

你在找这样的东西吗

publicGetData(id):可观察{
返回此.storage.get(id)
。然后(内容=>{
如果(内容===null){
返回此.getObject(id);
}否则{
归还(内容);
}
}
}
然后,您可以这样称呼它:

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

你能试试这个吗

getData(id):可观察{
返回Observable.fromPromise(this.storage.get(id)).switchMap(content=>{
如果(内容===null){
返回此.getObject(id);
}否则{
归还(内容);
}
})
}

如果您使用的是RxJS 6,我建议您将承诺转换为可观察的(使用操作符),然后根据方法所需的行为,使用可管道操作符处理后续操作,如
点击
,或
开关映射
。在这种情况下,我们可以使用,因为我们返回的是可观察的

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
,并返回可观测值

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

如果您使用的是RxJS 6,我建议您将承诺转换为可观察的(使用操作符),然后根据方法所需的行为,使用可管道操作符处理后续操作,如
点击
,或
开关映射
。在这种情况下,我们可以使用,因为我们返回的是可观察的

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
,并返回可观测值

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

使用RxJS中的
of
操作符将字符串放入可观察对象中,以标准化方法调用。此外,您应该在方法上设置一个返回类型&使用RxJS Observable not promise。使用RxJS中的
of
操作符将字符串放入可观察对象中,以标准化方法调用。此外,您应该在方法上设置一个返回类型您的方法&使用RxJS Observable not promise。谢谢您的回答。我复制了您的代码并得到了此错误:“TS2740:Type'promise'缺少Type'Observable'中的以下属性:\ isScalar、source、operator、lift等6。”我更新了我的代码,替换了三元if。这会给你同样的错误吗?我更新了我的帖子。请检查。我在TS2339中发现:属性“fromPromise”在类型“typeof Observable”上不存在。但是如果我在你以前的代码和链上删除“Observable”。然后和。订阅它也可以。好吧!我不习惯于承诺(:如果您的问题得到解决,请随意编辑我的帖子,添加工作代码:)谢谢您的回答。我复制了您的代码,但出现了以下错误:“TS2740:类型‘Promise’缺少类型‘Observable’中的以下属性:\ isScalar、source、operator、lift等6个。”我更新了我的代码,替换了三元if。这会给你同样的错误吗?我更新了我的帖子。请检查。我在TS2339中发现:属性“fromPromise”在类型“typeof Observable”上不存在。但是如果我在你以前的代码和链上删除“Observable”。然后和。订阅它也可以。好吧!我不习惯于承诺(:如果您的问题得到解决,请随意编辑我的帖子,添加工作代码:)