【问题标题】:Type 'Promise<string[]>' is not assignable to type 'string[]'类型 'Promise<string[]>' 不可分配给类型 'string[]'
【发布时间】:2021-09-24 21:01:20
【问题描述】:

出现以下错误: 类型“Promise”不可分配给类型“string[]”。 “Promise”类型中缺少属性“includes”。

当我将 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);
      }
    }

【问题讨论】:

    标签: angular


    【解决方案1】:

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

    public doughnutChartLabels: string[];
    
    this.memberService.getmemberheader().then(res => {
      this.doughnutChartLabels = res;
    })
    

    【讨论】:

    • 请您再解释一下。
    • @levolutionniste 我想我的回答已经解释得够多了。无论如何,OP 的 getmemberheader 函数返回 Promise&lt;[]&gt; 而不是 [] 本身。再次检查。 :-)
    • 可以声明this.doughnutChartLabels = this.memberService.getmemberheader();吗?
    • @Lobato 不可能,this.memberService.getmemberheader() 返回一个承诺,而不是真实数据。
    【解决方案2】:

    @levolutionniste

    函数 getmemberheader() 返回一个承诺。

    promise 的主要动机是将同步风格的错误处理带入异步/回调风格的代码。 ES6 在其 Promise 实现中采用了这个规范。 Promise 有一种特殊的语法,它允许将 Promise 以菊花链形式连接在一起,从而允许一个 Promise 的结果提供给下一个 Promise。

    所以:

    getmemberheader()
    .then((returnsAStringArrayObjectHere_YouCanCallItAnythingYouLike) => {
     // Do something with this array here
    })
    .catch((error) => {
     console.log("Oops something went wrong: ", error);
    });
    

    这里有一些关于 Promise 的文章:

    所以 getmemberheader 会返回一个 string[] 类型的 promise。

    this.memberService.getmemberheader().then(res => {
      this.doughnutChartLabels = res;
    })
    

    这就是为什么在 中间线 变量 res 包含来自 getmemberhead 承诺的字符串 []。然后在代码块 {} 中,用户将一个字段 donutChartLabels 设置为这个变量 res。

    Promises 非常适合使用,尤其是在使用经常返回 Promise 的 ORM 时,可以轻松地将它们以菊花链方式连接在一起 - 这确保代码在整个 Promise 链中从左到右同步运行。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2019-11-15
      • 1970-01-01
      • 2022-11-30
      • 2020-07-05
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多