【问题标题】:Return on complete async with RxJs与 RxJs 完全异步返回
【发布时间】:2018-10-12 10:06:46
【问题描述】:

我正在尝试从一个使用 rxjs 调用 API 的函数返回一个值(一个字符串)。该变量必须在 observable 的完整子句中返回。

这是代码:

getToken(): any {
    let token = '';

    this.meService.getMe().subscribe(data => {},
      err => {
        let headers = new HttpHeaders();
        headers = headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8').set(InterceptorSkipHeader, '');
        this.http.post(Configs.heroku + 'https://login.microsoftonline.com/common/oauth2/v2.0/token', 'grant_type=authorization_code&code=' + localStorage.getItem('refresh') + '&client_id=' + Configs.appId + '&redirect_uri=http://localhost:4200/redirect&' + 'client_secret=lkcqTNT730}zyoVLOX45)|;', {headers: headers}).subscribe(data => {
          localStorage.setItem('access', data['access_token']);
          token = localStorage.getItem('access');
        });
      },
      () => {
        return localStorage.getItem('access');
      });
  }

如您所见:我试图在完整子句中返回一个变量。但是,它从不返回变量。当我在调用函数中打印出来时,它只是说未定义。有什么解决办法吗?

提前致谢!

编辑:

这是函数被调用的部分:

console.log(auth.getToken());
    req = req.clone({
      setHeaders: {
        'Content-Type': 'application/json; charset=utf-8',
        'Authorization': 'Bearer ' + auth.getToken()
      }
    });

【问题讨论】:

  • 返回到什么,究竟是什么?您的外部方法不返回任何内容。
  • 是的,我想从我的“完整条款”中返回。如您所见,那里有回报。
  • 是的,我可以看到,但目前还不清楚你期望它去哪里。返回到什么?
  • 我编辑了我的问题。我希望 'auth.getToken()' 返回 return 语句中指定的值。
  • 你还没有理解异步(RxJs/Promise)JavaScript 编程是如何工作的。

标签: angular asynchronous rxjs observable


【解决方案1】:

我会尽力向您解释发生了什么。

  1. 您的 getToken 函数没有返回任何内容。所以当你打印出来时你会得到不确定的。
  2. 当您订阅 observable 时,您有 3 个可能的参数:
    • next:每次在 observable 中获得“tick”时执行。
    • error:出错时执行。
    • 完成:在可观察对象完成时执行。

在任何这些情况下,您都会传递一个回调,当这些事件发生时必须执行该回调。由于您在这些回调内部返回,因此您不会返回 getToken 方法,而是返回 subscribe 方法内部调用的函数。想象一下 subscribe 方法的可能实现:

subscribe(nextCB, errorCB, completeCB){
    ...
    if(completed) {
        completeCB();
    }
}

如您所见,您为完成回调返回的值没有被分配或返回。 您的案例有多种解决方案/替代方案。您可以使用一些地图返回可观察对象本身(this.meService.getMe()),然后在任何您想要的地方订阅它,或者您可以简单地在完整的回调中运行您的代码。 但 IMO 最好花一些时间寻找 javascript 通用闭包和异步概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2013-03-22
    • 1970-01-01
    • 2018-04-13
    • 2021-07-16
    相关资源
    最近更新 更多