Angular 2 中的部分可观察处理
Partial observable handling in Angular 2
我有一个登录表单的组件:loginForm
调用我的 api:
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api.login(username, password);
.map(res => res.json())
.subscribe(
this._processData,
);
}
有一个调用 api 的服务:loginService
。
login(username: string, password: string): Subscription<any> {
let headers = new Headers();
headers.append("Content-Type", "application/json");
return this.http.put("https://myapi.com", JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json())
.subscribe(
data => console.log(data),
err => console.log(err),
() => console.log("Done")
);
}
我要的是在loginService内部处理的错误。但是结果返回到 onLogin
方法。
我在 onLogin 中尝试了各种映射处理程序(如图所示),但无法使其正常工作。关于我可能做错的任何想法?
实际上,你在subscribe
方法中定义了一个回调来处理login
方法中的错误(第二个参数)。如果您想让错误传播到您的 onLogin
方法中,您需要删除此回调(甚至 subscribe
的调用)。
return this.http.put("https://myapi.com",
JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json());
如果您想记录错误然后传播它,您可以利用 Observable.throw
方法:
return this.http.put("https://myapi.com",
JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json())
.catch(err => {
console.log(err);
return Observable.throw(err);
});
在这种情况下你需要添加一个回调来处理onLogin
方法中的错误:
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api.login(username, password)
.subscribe(
(data) => {
// Success
this._processData(data)
},
(err) => {
// Error
}
);
}
您可以注意到 Observable
上有一个 catch
运算符来捕获错误,在出现错误的情况下,不会调用 map
运算符。
这些答案可以为您提供更多详细信息:
希望对你有帮助,
蒂埃里
您可以在您的服务中定义您的错误处理程序,并只从您订阅的组件传递错误。
// component
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api
.login(username, password)
.subscribe(
this._processData, // success
this.api.onError // error
// if above doesn't work this should:
// error => this.api.onError(error)
);
}
_processData(...data) { console.log(data); }
// service
login(username: string, password: string): Subscription<any> {
let headers = new Headers();
headers.append("Content-Type", "application/json");
return this.http
.put("https://myapi.com", JSON.stringify({ username: username, password: password}), { headers: headers })
.map(res => res.json())
}
onError(...args) { console.log(args); }
我有一个登录表单的组件:loginForm
调用我的 api:
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api.login(username, password);
.map(res => res.json())
.subscribe(
this._processData,
);
}
有一个调用 api 的服务:loginService
。
login(username: string, password: string): Subscription<any> {
let headers = new Headers();
headers.append("Content-Type", "application/json");
return this.http.put("https://myapi.com", JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json())
.subscribe(
data => console.log(data),
err => console.log(err),
() => console.log("Done")
);
}
我要的是在loginService内部处理的错误。但是结果返回到 onLogin
方法。
我在 onLogin 中尝试了各种映射处理程序(如图所示),但无法使其正常工作。关于我可能做错的任何想法?
实际上,你在subscribe
方法中定义了一个回调来处理login
方法中的错误(第二个参数)。如果您想让错误传播到您的 onLogin
方法中,您需要删除此回调(甚至 subscribe
的调用)。
return this.http.put("https://myapi.com",
JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json());
如果您想记录错误然后传播它,您可以利用 Observable.throw
方法:
return this.http.put("https://myapi.com",
JSON.stringify({ username: username, password: password}), {
headers: headers
})
.map(res => res.json())
.catch(err => {
console.log(err);
return Observable.throw(err);
});
在这种情况下你需要添加一个回调来处理onLogin
方法中的错误:
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api.login(username, password)
.subscribe(
(data) => {
// Success
this._processData(data)
},
(err) => {
// Error
}
);
}
您可以注意到 Observable
上有一个 catch
运算符来捕获错误,在出现错误的情况下,不会调用 map
运算符。
这些答案可以为您提供更多详细信息:
希望对你有帮助, 蒂埃里
您可以在您的服务中定义您的错误处理程序,并只从您订阅的组件传递错误。
// component
onLogin(): void {
let username = this.loginForm.value.username;
let password = this.loginForm.value.password;
this.api
.login(username, password)
.subscribe(
this._processData, // success
this.api.onError // error
// if above doesn't work this should:
// error => this.api.onError(error)
);
}
_processData(...data) { console.log(data); }
// service
login(username: string, password: string): Subscription<any> {
let headers = new Headers();
headers.append("Content-Type", "application/json");
return this.http
.put("https://myapi.com", JSON.stringify({ username: username, password: password}), { headers: headers })
.map(res => res.json())
}
onError(...args) { console.log(args); }