Angular 类型';承诺<;字符串[]>';不可分配给类型';字符串[]和#x27;

Angular 类型';承诺<;字符串[]>';不可分配给类型';字符串[]和#x27;,angular,Angular,获取以下错误: 类型“承诺”不可分配给类型“字符串[]”。 类型“Promise”中缺少属性“includes”。 当我承诺键入“string[]”时 下面是我的代码 组件:app.dashboard.ts import {Component} from '@angular/core'; import { MemberService } from "./app.service"; @Component({ selector:'app-root', templateUrl:'./app.dashb

获取以下错误: 类型“承诺”不可分配给类型“字符串[]”。 类型“Promise”中缺少属性“includes”。

当我承诺键入“string[]”时 下面是我的代码

组件:app.dashboard.ts

import {Component} from '@angular/core';
import { MemberService } from "./app.service";
@Component({
selector:'app-root',
templateUrl:'./app.dashboard.html',
providers:[MemberService]
          })

export class AppDashboard{
  title='Dashboard'
  constructor(private memberService: MemberService) { }

  public doughnutChartLabels:string[] = 
    this.memberService.getmemberheader();//error occurred here
  }
}
服务:app.Service.ts

import { Injectable } from '@angular/core';
import { Member } from './Member';
import { Http, Response, Headers, RequestOptions, URLSearchParams } from'@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class MemberService
{
  constructor(private http: Http) {
  }

  private getHeaders(){
    // I included these headers because otherwise FireFox
    // will request text/html instead of application/json
    let headers = new Headers();
    headers.append('Accept', 'application/json');
    return headers;
  }

  getmemberheader(): Promise<string[]> {
    return this.http
        .get(`/ReportService/MemberDatabaseCountryname`, {headers: this.getHeaders()})
        .toPromise()
        .then(this.extractData)
        .catch(this.handleError);
  }  

  private extractData(res: Response) {
    let body = res.json();

    return body || {};
  }
  private handleError(error: any): Promise<any> {
    console.error('An error occurred', error);
    return Promise.reject(error.message || error);
  }
}
从'@angular/core'导入{Injectable};
从“/Member”导入{Member};
从'@angular/Http'导入{Http,Response,Headers,RequestOptions,URLSearchParams};
导入'rxjs/add/operator/map';
导入“rxjs/add/operator/toPromise”;
@可注射()
导出类成员服务
{
构造函数(专用http:http){
}
私有getHeaders(){
//我之所以包含这些标题,是因为其他原因
//将请求text/html而不是application/json
let headers=新的headers();
headers.append('Accept','application/json');
返回标题;
}
getmemberheader():承诺{
返回此文件。http
.get(`/ReportService/MemberDatabaseCountryname`,{headers:this.getHeaders()})
.toPromise()
.然后(此.extractData)
.接住(这个.把手错误);
}  
私有数据(res:Response){
让body=res.json();
返回体| |{};
}
私有句柄错误(错误:任意):承诺{
console.error('发生错误',error);
返回承诺。拒绝(error.message | | error);
}
}

假设来自
http的响应。get
是一个数组,这里您从函数
memberService返回
Promise
。getmemberheader
,您应该在其
回调中检索Promise的结果,然后改为
回调(而不是将Promise本身分配给数组
doughnutChartLabels

@左旋

函数getmemberheader()返回一个承诺

promises的主要动机是将同步样式的错误处理引入到异步/回调样式的代码中。ES6已采用此规范来实现其承诺。承诺有一种特殊的语法,允许承诺以菊花链连接在一起,允许一个承诺的结果传递给下一个承诺

因此:

以下是一些关于承诺的文章:

  • -我最喜欢的
因此getmemberheader将返回字符串[]类型的承诺

this.memberService.getmemberheader().then(res => {
  this.doughnutChartLabels = res;
})
这就是为什么在中间的变量res包含getmemberhead promise中的字符串[]。然后在代码块{}中,用户将字段doughnutChartLabels设置为该变量res


承诺非常适合使用,尤其是在使用ORM时,ORM通常会返回承诺,这使得将它们串联在一起变得很容易,从而确保代码在整个承诺链中从左到右同步运行。

请您进一步解释一下。@LevolutionNist我想我的回答已经解释得够多了。无论如何,OP的
getmemberheader
函数返回一个
Promise
而不是
[]
本身。请再次检查。:-)是否可以声明this.doughnutChartLabels=this.memberService.getmemberheader()
?@Lobato不可能,
this.memberService.getmemberheader()
返回承诺,而不是实际数据。
getmemberheader()
.then((returnsAStringArrayObjectHere_YouCanCallItAnythingYouLike) => {
 // Do something with this array here
})
.catch((error) => {
 console.log("Oops something went wrong: ", error);
});
this.memberService.getmemberheader().then(res => {
  this.doughnutChartLabels = res;
})