Angular2地图 - >订阅数据类型错误(类型'ErrorObservable'上不存在属性'长度'。)

时间:2017-05-08 15:56:33

标签: javascript angular

我在网页编程方面遇到了困难。

我想使用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 [] |类型中不存在属性'length' ErrorObservable”。
  'ErrorObservable'类型中不存在属性'length'。

还有第二个问题:

如何调用错误方法? (// Q2)

ret.mockError(new Error('Username or password is incorrect'));

1 个答案:

答案 0 :(得分:3)

如果你没有在回调中提及数据类型,默认情况下你的编辑器会引用调用方法的返回类型。因此,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);
  }
}