从Promise

时间:2017-05-31 14:08:41

标签: angular asynchronous promise

在调用方法中,我需要从此方法的返回值中提取类别数组(Category [])。我该怎么做呢。我不能快速兑现承诺。

getCategories() : Promise<Category[]> {
    return this.http.get(this.categoriesUrl).toPromise()
        .then(response => response.json().data as Category[])
        .catch(this.handleError);
}

如何从上述getCategories()方法的结果中提取特定类别?这不起作用。

getCategory(id: string): Category {
 return this.getCategories()
   .filter((category: Category, index: number, array: Category[]) => {
            return category.id === id;
        });
}

3 个答案:

答案 0 :(得分:0)

对返回的承诺

使用then
getCategories().then((categories: Category[]) => {
    console.log(categories)
});

答案 1 :(得分:0)

getCategories()实际上没有像你期望的那样返回数据,它实际上会返回一个承诺!

您需要致电&#39; .then&#39;在调用此函数的代码中。

以下是您最简单的形式。

> fr type is <class 'float'>                                         
> Traceback (most recent call last):                                    
> File "createRFRegion.py", line 260, in <module>                       
> write_rf_region(rf_region_file, rf_region_filename)                   
> File "createRFRegion.py", line 233, in write_rf_region                
> rf_region_file.write(create_rx_channel(channel, i))                   
> File "createRFRegion.py", line 164, in create_rx_channel              
> <Frequency>" + str(fr) + "</Frequency>\n\                             
> TypeError: must be str, not int

Promise是链接的,所以你总是需要在链的末尾打电话。

答案 2 :(得分:-1)

您不应该使用承诺,而应该学习拥抱RxJS Observables。然后,您可以在调用函数内部订阅Observable的结果,并保存对组件内部数据的引用(或任何类调用服务函数)。

// my-service.ts
getCategories(): Observable<Category[]> {
    return this.http.get(this.categoriesUrl)
        .map(response => response.json().data as Category[]);
}

getCategory(id: string): Category {
    return this.getCategories()
        .selectMany(Observable.fromArray)
        .filter((category: Category, index: number) => {
            return category.id === id;
        })
        .first();
}

// my-component.ts
this.service.getCategories().subscribe((categories: Category[]) => {
    this.localCategories = categories;
})

map函数将修改从Observable接收的数据。注意:http请求在订阅之前不会触发。