获取以下错误: 类型'承诺'不能分配给' string []'。 财产包括'类型'承诺'
中缺少当我将Promise转换为' 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);
}
}
答案 0 :(得分:10)
假设您http.get
的回复是一个数组,在这里您从函数Promise
返回memberService.getmemberheader
,您应该在其then
回调中检索承诺的结果(不是将承诺本身分配给数组doughnutChartLabels
)。
public doughnutChartLabels: string[];
this.memberService.getmemberheader().then(res => {
this.doughnutChartLabels = res;
})
答案 1 :(得分:0)
@levolutionniste
函数getmemberheader()返回一个promise。
承诺的主要动机是将同步样式错误处理引入Async / Callback样式代码。 ES6已将此规范用于Promise实施。 Promise具有一种特殊的语法,允许将诺言以菊花链的形式链接在一起,从而允许一个诺言的结果提供给下一个诺言。
所以:
getmemberheader()
.then((returnsAStringArrayObjectHere_YouCanCallItAnythingYouLike) => {
// Do something with this array here
})
.catch((error) => {
console.log("Oops something went wrong: ", error);
});
以下是有关诺言的文章:
因此getmemberheader将返回类型为string []的Promise。
this.memberService.getmemberheader().then(res => {
this.doughnutChartLabels = res;
})
这就是为什么在中线上,变量 res 包含getmemberhead promise中的字符串[]的原因。然后,在代码块{}中,用户为此变量res设置一个fieldoughnutChartLabels字段。
使用承诺非常好,特别是与经常返回承诺的ORM一起使用时,可以很容易地将它们以菊花链方式链接在一起-这样可以确保代码在整个承诺链中从左到右同步运行。
希望这会有所帮助。