我有一个Angular应用程序,我需要做几个API调用,并将所有这些调用合并为一个promise。这就是我试过的:
getPromiseFromAllDays(dates):Promise<any>
{
return this.getAll(dates).map(
(arrayOfResults) =>
{
return new Promise((resolve, reject) =>
{
resolve(arrayOfResults);
});
}).toPromise();
}
getAll(dates):Observable<any>[]
{
return dates.map(
(day) => return this.getOneDay(day).first();
);
}
getOneDay(day):Observable<any>
{
let path = 'days/'+day;
return this.db.list(path) as FirebaseListObservable<any>;
}
寻找解决方案我试图将代码切成可追踪的部分。
我认为我需要第一个(),因为FirebaseObservables不会在没有完成的情况下完成。
我已经能够得到几个Promises,但我可以将它们全部组合起来。我真的不确定新的Promise - toPromise构造。我的回答定义是否正确?
答案 0 :(得分:0)
这应该达到你想要的结果:
getPromiseFromAllDays(dates: any[]):Promise<any>
{
return this.getAll(dates).toPromise();
}
getAll(dates: any[]):Observable<any>
{
return Observable.from(dates).flatMap(
(day) => return this.getOneDay(day);
);
}
getOneDay(day):Observable<any>
{
let path = 'days/'+day;
return this.db.list(path) as FirebaseListObservable<any>;
}
这样做是为了接受日期数组并将其转换为所有日期值的Observable
序列。然后,我们使用flatMap
切换到从这些日期中创建的新的observable。由于from
运算符,我们只需从Observable
返回一个getAll
,然后在toPromise
内的结果Observable
上使用getPromiseFromAllDays
方法方法
答案 1 :(得分:0)
使用forkJoin同时发送getOne:
i = 1000;
function getOne(date) {
i = i - 500;
return Rx.Observable.timer(i).mapTo('Date is' + date);
}
function getAllDates(dates) {
let obsList$ = dates.map(date => getOne(date));
return Rx.Observable.forkJoin(...obsList$);
}
function getPromiseFromAllDays(dates) {
return getAllDates(dates).toPromise();
}
getPromiseFromAllDays([1,2,3]).then(x=>console.log(x))