类型“可观察”不能分配给类型“任何[]”。类型“可观察”中缺少属性“长度”

时间:2018-09-06 15:00:14

标签: arrays angular typescript angular2-observables

在我的Angular应用中,我通过异步调用提取了一些数据。然后,一旦有了这些数据,便有了一个在该数组上迭代的函数(见下文),并为传入的相应stageName获取了record_id。但是我遇到了ts错误-stageRecords下有一个红色的波浪状(请参阅下面的星号),错误是:

  

[ts]类型“可观察”不能分配给类型“ any []”。
  类型“可观察”中缺少属性“长度”。

这是我的代码:

public async getStageIdByName(stageName)
{
    let stageRecords = [];
    **stageRecords** = await this.getAllStages();
    if (stageName && stageRecords) {
        console.log('stageRecords: ', stageRecords);
        for (let record of stageRecords) {
            if (record.stage === stageName) {
                let stageId = record._id;
                console.log(`stageId for ${stageName} is ${stageId}`);
                return stageId;
            }
        }
    }
}

我需要更改以解决此问题吗?我尝试使用Array.from(),但这不能解决可观察到的问题,这显然使此举变得不可能。我该如何解决从对this.getAllStages()的响应中获取数组的问题?

更新:提出建议后,我导入了toPromise()运算符,然后将代码更改为如下形式:

public async getStageIdByName(stageName)
{
    let stageRecords = [];
    stageRecords = await this.getAllStages().toPromise();
    if (stageName && stageRecords) {
        console.log('stageRecords: ', stageRecords);
        for (let record of stageRecords) {
            if (record.stage === stageName) {
                let stageId = record._id;
                console.log(`stageId for ${stageName} is ${stageId}`);
                return stageId;
            }
        }
    }
}

这似乎是正确的轨道,但是,我现在遇到此错误:

Type 'Response' is not assignable to type 'any[]'.
  Property 'length' is missing in type 'Response'.

顺便说一句,我的getAllStages()函数看起来像这样:

public getAllStages()
{
    let stageRecords;
    let recordsArray;
    let fn = response => {
        stageRecords = response.data;
        if (stageRecords) {
            recordsArray = Array.from(stageRecords);

            return recordsArray;
        }
    };

    return this.stageService.getStages((fn));
}

1 个答案:

答案 0 :(得分:3)

您的getAllStages返回Observable,而不是诺言,因此您无法等待。

您可以通过toPromise()方法做出承诺,也可以订阅。

如果您使用rxjs 6(角度6),并且后面是http请求,则此方法应该有效,在旧版本中,您需要导入该toPromise运算符。

stageRecords = await this.getAllStages().toPromise();

在较早版本的angular中,您需要像这样导入该运算符

import 'rxjs/add/operator/toPromise';