Angular 类型';承诺<;字符串[]>';不可分配给类型';字符串[]和#x27;
获取以下错误: 类型“承诺”不可分配给类型“字符串[]”。 类型“Promise”中缺少属性“includes”。 当我承诺键入“string[]”时 下面是我的代码 组件:app.dashboard.tsAngular 类型';承诺<;字符串[]>';不可分配给类型';字符串[]和#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
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;
})