将可观察量与单一承诺相结合

时间:2017-05-03 18:57:40

标签: angular promise rxjs observable

我有一个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构造。我的回答定义是否正确?

2 个答案:

答案 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))