输入&#39; Promise <string []>&#39;不能分配给&#39; string []&#39;

时间:2017-08-01 06:24:54

标签: angular

获取以下错误: 类型&#39;承诺&#39;不能分配给&#39; string []&#39;。   财产包括&#39;类型&#39;承诺&#39;

中缺少

当我将Promise转换为&#39; string []&#39; 我的代码如下,

组件: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);
  }
}

2 个答案:

答案 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一起使用时,可以很容易地将它们以菊花链方式链接在一起-这样可以确保代码在整个承诺链中从左到右同步运行。

希望这会有所帮助。