我在网络编程方面有困难。
我想使用 HTTP 通信,调用"map"并传递数组数据。
makeTables(json:string) {
let arr:Array<any> = [];
...
return arr;
}
query(spName: string, objParam: Array<any>) {
return this.http.post(this.url, this.data)
.map(x => this.makeTables(x.json()));
};
login(username: string, password: string) {
let ret = this.mysql.query("sp_admin_login", [username, password]);
ret.subscribe( x => {
// ERROR !!!!!!!!!
console.log(x.length);
if(1 ==1 /*user && user.token*/) {
localStorage.setItem("user", "user");
} else {
// Q2
// ret.mockError(new Error('Username or password is incorrect'));
}
});
return ret;
}
//错误!!!!!!!!
访问 x.length 时出现错误
错误消息是
/<小时 />admin/src/app/_authentication/authentication.service.ts (17,27(:
属性"长度"在类型"any[] |ErrorObservable'.
属性"长度"在类型"错误可观察"上不存在。
第二个问题:
如何调用错误方法?(//Q2 (
ret.mockError(new Error('Username or password is incorrect'));
如果你在回调中没有提到数据类型,默认情况下你的编辑器将引用调用方法的返回类型。因此query()
方法可以返回Array<any>
也可以抛出类型为 ErrorObservable
的错误。如果要检查成功回调的长度,则应特别提及类型。 ret.subscribe((x : Array<any>) => {});
login(username: string, password: string) {
let ret = this.mysql.query("sp_admin_login", [username, password]);
ret.subscribe((x : Array<any>) => {
// x is a known array now
console.log(x.length);
if(1 ==1 /*user && user.token*/) {
localStorage.setItem("user", "user");
} else {
// Q2
this.mockError(new Error('Username or password is incorrect'));
}
});
return ret;
}
谈到错误处理,假设你已经有一个错误方法。这不是角度错误,而是身份验证错误,因为您在登录不成功时调用它。不适合使用这样的方法来处理应用程序中的错误情况。但这仍然有助于处理角度误差。
mockError(error){
if(error instanceof Error){
// log error here
console.log(error);
}
}