【问题标题】:Undefined response in first api call in ionic3 [duplicate]ionic3中的第一个api调用中未定义的响应[重复]
【发布时间】:2018-01-25 10:30:39
【问题描述】:

我正在尝试在 ionic3 中实现嵌套的 api 调用

submitLoginForm() {
    var username = this.formData.value.username;
    var password = this.formData.value.password;
    var bodyjson;
    var userId;

    this.ApidataService.logincheck(username,password).subscribe(data => {
        this.logindetail = data;
        bodyjson = JSON.parse(this.logindetail._body);
        userId =  bodyjson.user.id;
        if( userId != undefined){
            this.ApidataService.userdata(userId).subscribe(data => {
                this.userInfo = data;
            });
        }
        console.log(userId);
    });
    console.log(this.userInfo);
}

现在,当我调用此函数时,嵌套 api 为第一次调用返回 undefined,然后从第二次调用开始,它返回正确的值,但是当我尝试记录发送到 api 的参数时,我注意到正确的值每次都通过。我认为这是由于一些同步问题造成的,但我无法找出问题和解决方案。

【问题讨论】:

标签: javascript angular api observable ionic3


【解决方案1】:

您可以在此处使用flatMap。看来您不需要检索两个请求的结果,因此这应该适合您。

 import { Observable } from "rxjs/Observable";
 import 'rxjs/add/observable/flatMap';

然后:

 this.ApidataService.logincheck(username,password).flatMap(
  (data) => {
        this.logindetail = data;
        bodyjson = JSON.parse(this.logindetail._body);
        userId =  bodyjson.user.id;
        if( userId != undefined){
          return this.ApidataService.userdata(userId);
        }else{
          return Observable.empty();
        }
    }).map((res: Response) => res ? res.json() : {})
    .subscribe(data => {
           this.userInfo = data ? data : {};
    });

你可以阅读更多关于flatMap here

【讨论】:

  • 在我看来,总是使用forkJoin 是一个强有力的主张。还有其他几种方法可以处理这种情况。例如flatMap/mergeMap
  • 已更正。感谢@echonax 提供的信息
  • 没问题。但是你的答案又是错误的,因为forkJoin 是并行发出请求的。在 OP 的情况下,1 异步调用请求取决于其他人的响应。所以..
  • 哦..我没看到。我会看到你分享的链接。再次感谢:) @echonax
  • 非常感谢。我学到了很多。是的..但是我在标记Duplicate之前发布了这个(错误的)。所以我认为没有问题。再次感谢:) @echonax跨度>
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2022-07-03
  • 2021-05-23
  • 2018-11-08
相关资源
最近更新 更多