Angular 2:将Observable转换为Promise

时间:2016-04-21 18:07:44

标签: typescript angular promise observable

问:如何将以下observable转换为promise,以便我可以使用.then(...)调用它?

我希望转换为承诺的方法:

  this._APIService.getAssetTypes().subscribe(
    assettypes => {
        this._LocalStorageService.setAssetTypes(assettypes);
    },
    err => {
        this._LogService.error(JSON.stringify(err))
    },
    () => {}
  ); 

它调用的服务方法:

  getAssetTypes() {
    var method = "assettype";
    var url = this.apiBaseUrl + method;

    return this._http.get(url, {})
      .map(res => <AssetType[]>res.json())
      .map((assettypes) => {
        assettypes.forEach((assettypes) => {
          // do anything here you might need....
      });
      return assettypes;
    });      
  }  

谢谢!

7 个答案:

答案 0 :(得分:68)

<强> rxjs6

https://github.com/ReactiveX/rxjs/issues/2868#issuecomment-360633707

  不要管道。它默认位于Observable对象上。

Observable.of('foo').toPromise(); // this

<强> rxjs5

import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';

...

this._APIService.getAssetTypes()
.map(assettypes => {
  this._LocalStorageService.setAssetTypes(assettypes);
})
.toPromise()
.catch(err => {
  this._LogService.error(JSON.stringify(err));
});

答案 1 :(得分:15)

observable可以像这样转换成承诺:

let promise=observable.toPromise();

答案 2 :(得分:11)

你真的不需要这样做......

import 'rxjs/add/operator/first';


this.esQueryService.getDocuments$.first().subscribe(() => {
        event.enableButtonsCallback();
      },
      (err: any) => console.error(err)
    );
    this.getDocuments(query, false);

first()确保只调用一次订阅块(之后就好像你从未订阅过),与promises完全相同()

答案 3 :(得分:3)

根据您的情况,使Observable成为正确的承诺的正确方法是

SendKeys.Send("{RIGHT}");

答案 4 :(得分:3)

很多评论声称toPromise已过时,但正如您所见here并非如此。

因此,请按照以下说明使用toPromise(RxJs 6):

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = sample('First Example')
  .toPromise()
  //output: 'First Example'
  .then(result => {
    console.log('From Promise:', result);
  });

异步/等待示例:

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = await sample('First Example').toPromise()
// output: 'First Example'
console.log('From Promise:', result);

了解更多here

并且请删除这个错误的说法,说toPromise已过时。


注意:否则,您可以使用.pipe(take(1)).toPromise,但如上所述,使用上面的示例应该没有任何问题。

答案 5 :(得分:1)

toPromise在RxJS 7中为deprecated

使用:

  1. lastValueFrom

在我们对值流感兴趣时使用。像以前的toPromise

示例

public async getAssetTypes() {
  const assetTypes$ = this._APIService.getAssetTypes()
  this.assetTypes = await lastValueFrom(assetTypes$);
}
  1. firstValueFrom

在我们对值流不感兴趣而仅对第一个值感兴趣然后取消订阅时使用

public async getAssetTypes() {
  const assetTypes$ = this._APIService.getAssetTypes()
  this.assetTypes = await firstValueFrom(assetTypes$); // get first value and unsubscribe
}

答案 6 :(得分:0)

您可以仅通过以下一行代码将Observable转换为promise:

let promisevar = observable.toPromise()

现在,您可以在promisevar上使用then,然后根据您的需求应用条件。

promisevar.then('Your condition/Logic');