각도 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에서 더 이상 사용되지 않습니다.
용도:
lastValueFrom
가치의 흐름에 관심이 있을 때 사용합니다.전자와 같이 작동합니다.toPromise
예
public async getAssetTypes() {
const assetTypes$ = this._APIService.getAssetTypes()
this.assetTypes = await lastValueFrom(assetTypes$);
}
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
'programing' 카테고리의 다른 글
AngularJS: ngTouch 300ms 지연 (0) | 2023.10.12 |
---|---|
ID와 클래스의 차이점은 무엇입니까? (0) | 2023.10.12 |
WordPress 내부의 작성자 보관 페이지에서 작성자 이름 가져오기 (0) | 2023.10.12 |
DataSet/DataTable을 반환하는 PowerShell 함수의 이상한 동작 (0) | 2023.10.12 |
data.frame에서 결측값을 보고하는 우아한 방법 (0) | 2023.10.12 |