programing

각도 2: 관찰 가능을 약속으로 변환

testmans 2023. 10. 12. 22:15
반응형

각도 2: 관찰 가능을 약속으로 변환

Q) 다음 관찰 가능 항목을 약속으로 전환하여 다음과 같이 부를 수 있도록 하려면 어떻게 해야 합니까?.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;
    });      
  }  

감사합니다!

rxjs7

lastValueFrom(of('foo'));

https://indepth.dev/ posts/1287/ rxjs-약속사항-deprec화중

rxjs6

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

담배 피우지 마.기본적으로 관찰 가능 개체에 있습니다.

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));
});

관측 가능은 다음과 같이 약속으로 변환할 수 있습니다.

import { firstValueFrom, lastValueFrom } from 'rxjs';
...
lastValueFrom(observable).then(lastValue=>...);
firstValueFrom(observable).then(firstValue=>...);

toPromise()RxJS 7에서 더 이상 사용되지 않는 이전 솔루션은 다음과 같습니다.

let promise=observable.toPromise();


 

당신은 정말로 이것을 할 필요가 없습니다. 그냥 하세요...

import 'rxjs/add/operator/first';


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

첫 번째 ()은 구독 블록이 한 번만 호출되는지 확인합니다(그 후에는 마치 구독하지 않은 것처럼 됨). 약속과 정확히 동일합니다.

Observable을 약속으로 만드는 적절한 방법은 다음과 같습니다.

getAssetTypesPromise() Observable<any> {
  return new Promise((resolve, reject) => {
      this.getAssetTypes().subscribe((response: any) => {
        resolve(response);
      }, reject);
    });
}

편집:

.toPromise()이제 RxJS 7에서 더 이상 사용되지 않습니다(출처: https://rxjs.dev/decrecations/to-promise).

새 답변:

더 이상 사용하지 않는 약속() 메서드를 대체하기 위해 정적 변환 함수 firstValueFrom 또는 lastValueFrom 중 하나를 기본으로 사용해야 합니다.

예:

import { interval, lastValueFrom } from 'rxjs';
import { take } from 'rxjs/operators';
 
async function execute() {
  const source$ = interval(2000).pipe(take(10));
  const finalNumber = await lastValueFrom(source$);
  console.log(`The final number is ${finalNumber}`);
}
 
execute();
 
// Expected output:
// "The final number is 9"

이전 답변:

많은 분들이 지금.toPromise감가상각을 했지만 여기 보시는 처럼 그렇지 않습니다.

그래서 그냥 사용해주세요.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);
  });

비동기/await 예제:

//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);

여기서 더 읽어보세요.


참고: 그렇지 않으면 다음을 사용할 수 있습니다..pipe(take(1)).toPromise말씀하신 것처럼 위의 예시를 사용하는 데 문제가 없을 겁니다.

toPromise는 RxJS 7에서 더 이상 사용되지 않습니다.

용도:

  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
}

다음과 같이 한 줄의 코드만으로 Observable을 약속하도록 변환할 수 있습니다.

let promisevar = observable.toPromise()

이제 약속 변수를 사용하여 요구 사항에 따라 조건을 적용할 수 있습니다.

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

저는 생것을 좋아해서 이것은 더이상 약속을 하지 않습니다.

   const status = await new Promise<boolean>((resolve, reject) => {
     someObs$.subscribe({
      next: resolve,
      error: reject,
    });
  });

정교한 방법은 https://rxjs.dev/api/index/function/lastValueFrom을 사용하는 것입니다.

  const replyTo = new AsyncSubject();

  replyTo.next(false);
  replyTo.next(false);
  replyTo.next(true);

  replyTo.complete();

  const status = await lastValueFrom(replyTo) // true

언급URL : https://stackoverflow.com/questions/36777284/angular-2-convert-observable-to-promise

반응형