【问题标题】:Throwing an error in map does not prevent the consecutive map to be executed在映射中抛出错误不会阻止执行连续映射
【发布时间】:2017-06-11 22:19:19
【问题描述】:

在我的 Angular 应用程序中,我有以下登录方法:

login(username, password): Observable<User> {
  let data = new URLSearchParams();
  data.append('username', username);
  data.append('password', password);
  const url = 'https://server.com/some-endpoint/';
  return this.http.post(url, data)
    .map(res => res.json())
    .map(json => throwUnlessLoginSuccessful('properties', json))
    .map(json => new User().deserialize(json));
}

所以我想对响应执行以下操作:

  1. 将响应转换为 JSON
  2. 检查 JSON 并检查正确的响应代码并引发错误。
  3. 如果这一切正常,则将 json 解析为我的用户对象。

这是我的throwUnlessLoginSuccessful 方法:

private throwUnlessLoginSuccessful(string: string, json: Object) {

  if (Number(json["responseCode"]) > 0) {
    console.warn("Sign in failed");
    return Observable.throw(new Error(json['responseCodeMessage']));
  }
     return json;
}

这就是我在 UI 中使用登录服务的方式:

this.loginService.login(this.login.username, this.login.password).subscribe(
  user => {
    this.session.login(this.login.username);
    console.log(`Signed in with ${user.username}`);
    this.navCtrl.setRoot(TabsPage);
  },
  err => {
    console.log(`Sign in failed $\{err}`)
    this.loading.dismiss();
    console.log(err);
  },
  () => console.log('Completed')
);

结果

  1. 我使用错误的用户名登录,并按预期收到错误“登录失败”。奇怪的是没有显示“已完成”消息。
  2. 现在,如果我使用错误的用户名再次登录,应用会崩溃,并且我会收到 username 不可用的错误消息。

为什么第一次没有执行“已完成”?如果我使用错误的凭据重复登录,为什么行为会有所不同?

【问题讨论】:

    标签: angular typescript ionic-framework rxjs


    【解决方案1】:

    您应该throw new Error(...) 而不是返回Observable.throw(new Error(...))。目前你只是将坏结果映射到Observable。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2012-01-21
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多