【问题标题】:Return an Observable by using a Storage value使用 Storage 值返回 Observable
【发布时间】:2021-05-01 14:44:31
【问题描述】:

我对 Ionic 和 Django 还很陌生,但我正在尽力而为。 我目前正在努力解决一些问题,我希望在我的项目中到处实施奇怪的东西之前有良好的实践。

我有一个 Django 后端,它在 GET /users/{username} 上返回如下 JSON 对象:

{
"id":3,
"username":"admin",
"email":"admin@example.com",
"is_active":true,
"date_joined":"2021-04-24T14:05:33.724350Z"
}

具有以下功能: api.service.ts

getInfo() {       
        return from(Storage.get({ key: CURRENT_USERNAME }).then(data => {
            const userName = data.value
            console.log("url : " + `${environment.api_url}/users/${userName}`)
            return this.httpClient.get(`${environment.api_url}/users/${userName}`)
        })
        )
    }

profile.page.ts

async getInfo() {
    this.apiService.getInfo().subscribe(
      data => {
        console.log("my data stringified " + JSON.stringify(data))
        data.subscribe(data2 => {
          console.log("data 2 json " + JSON.stringify(data2))
        })
      },
      err => {
        // Set the error information to display in the template
        console.log(`An error occurred, the data could not be retrieved: Status: ${err.status}, Message: ${err.statusText}`)
      }
    );

几个问题:

  • 我使用存储对象来存储用户名是否正确?或者我不应该打扰,并使用全局变量,这将简化整个代码。
  • 正如您在我的 profile.page.ts 中看到的那样,该代码被承诺为可观察的,阅读起来非常糟糕,而且我很确定没有优化。但是,我没有找到任何方法在我的 api.service.ts getInfo() 方法中返回正确的信息。我想为我的 CURRENT_USERNAME 的值分配一个变量,但不使用全局变量,我无法实现。

谢谢!任何提示、良好做法和建议将不胜感激。

朱尔斯

【问题讨论】:

    标签: angular ionic-framework promise rxjs observable


    【解决方案1】:

    我认为将用户名保存在存储中是一个不错的选择。您可以将其更改为这样,每当应用程序初始化时,您从存储中获取用户名并将其分配给变量,例如您可以在组件中订阅的可观察对象,这样您就不需要获取它每次需要时从存储中获取。

    至于您目前拥有的代码,我会进行一些修改以使其更好。不建议嵌套订阅,但可以使用switchMap 链接请求。所以也许可以尝试这样的事情:

    服务:

    import { switchMap } from 'rxjs/operators';
    
    // ....
    
    getInfo() {       
        return from(Storage.get({ key: CURRENT_USERNAME })).pipe(
           switchMap(data => {
             const username = data.value;
             return this.httpClient.get(`${environment.api_url}/users/${userName}`)
           })
        );
    }
    

    和组件(缩短):

    getInfo() {
      this.apiService.getInfo().subscribe(data => {
         // do stuff with http-response
      });
    }
    

    【讨论】:

    • 感谢您提供详细信息。感谢 switchMap。我在教程等中看过几次,但不知道如何使用它。我读过一些文档(learnrxjs.io/learn-rxjs/operators/transformation/switchmap),但由于我是 Angular 的新手,我对此并不清楚。所以基本上,switchMap 用于将任何类型的地图转换为新的 Observable 对象,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2017-03-29
    • 2017-11-01
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多