Angular 中的 Observable vs Promoise
Angular 是一個用於構建 Web 應用程式的框架。Angular 有兩種主要的資料管理型別:observables
和 promises
。
Observables 和 Promises 的實現使我們更容易處理非同步程式,它們使用單獨的 API 並且動機略有不同。
本文將解釋什麼是 Angular 中的 Observable 和 Promise。此外,我們將解釋 Observable 和 Promise 之間的根本區別。
Angular 中的 Promise 是什麼
Promises
是一種 JavaScript 構造,它提供了一種處理非同步操作的方法。它們代表非同步操作的最終結果,可以處於以下三種狀態之一:掛起、完成或拒絕。
Promise 也可以連結在一起來表示一系列依賴的非同步操作。
此外,Promise 是一種可以在未來產生單個值的物件,可以是已解決的值,也可以是無法解決的原因,也可以是掛起的。
如果你仍然感到困惑,請將其應用於現實生活中。如果你向朋友做出承諾,你必須要麼履行承諾,要麼拒絕承諾;然而,有時你被困在中間,試圖履行承諾,但沒有做到。
同樣,程式設計中的 Promise 也可以作用於相同的過程。
Promise 的缺點包括:
- 失敗的呼叫無法重試。
- 隨著應用程式的增長,Promise 變得更加難以管理。
- 使用者無法取消對 API 的請求。
Angular 中的 Observable
Angular 中的 observables 到底是什麼?可以將其與最基本形式的 Promise 進行比較,並且隨著時間的推移它具有單個值。
另一方面,Observables 遠不止於此。Angular Observables 比 Promises 更強大,因為它具有許多優點,例如更好的效能和更容易除錯。
Observable
可以隨著時間的推移提供許多值,類似於流的工作方式,如果有任何錯誤,它可以快速終止或重試。Observables 可以以各種方式耦合,或者可能會競爭看誰可以使用第一個。
RxJS
Observables 庫是一個強大的工具。此外,它們就像事件發射器,可以隨著時間的推移發出無限的值。
缺點:
- 你必須獲得一個複雜的
observable
框架。 - 你可能會發現自己在意想不到的情況下使用
Observables
。
Angular 中 Promise 和 Observable 的主要區別
讓我們討論一下 Promise 和 Observable 之間的一些區別。
Promise |
Observable |
---|---|
一旦一個承諾被履行,它的價值就不會改變。它們僅限於發出、拒絕和解析單個值。 | 使用 observables 可以在一段時間內發出多個值。它有助於一次檢索多個值。 |
延遲載入不適用於 promise。因此,Promise 會在它們形成時立即應用。 | Observable 在訂閱之前不會開始執行。這使得 Observables 在需要操作時很方便。 |
Angular Promises 不是直接處理錯誤,而是總是將錯誤傳遞給孩子的 Promise。 | 錯誤處理是 Angular Observables 的責任。當我們使用 Observables 時,我們可以在一個地方處理所有錯誤。 |
一旦你開始承諾,你就不能退出承諾。Promise 將根據提供給 Promise 的回撥來解決或拒絕。 | 藉助 unsubscribe 方法,你可以隨時取消 observables。 |
Angular 中的 Promise
和 Observable
示例
讓我們討論一個例子,它可以幫助我們詳細理解 promise 和 observable 的概念。
TypeScript 程式碼:
import { Component } from '@angular/core';
import { Observable, Observer, } from "rxjs";
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
promiseTemp: Promise<boolean>;
createPromise() {
this.promiseTemp = this.testPromise(0);
}
observableTemp: Observable<boolean>;
createObservable() {
this.observableTemp = this.testObservable(0);
}
subscribeObservable() {
this.observableTemp
.subscribe(
result => {
console.log(`Observable Ok: ${result}`);
},
err => {
console.error(err);
});
}
observableNextTemp: Observable<boolean>;
createObservableNext() {
this.observableNextTemp = this.testObservableNext(0);
}
promiseTemp2: Promise<boolean>;
createToPromiseByObservable() {
this.promiseTemp2 = this.testObservable(0).toPromise();
}
observableForkJoinTemp: Observable<boolean[]>;
countForkJoin = 2;
testObservable(value: number): Observable<boolean> {
console.log("create Observable");
return Observable.create((observer: Observer<boolean>) => {
console.log("execute Observable");
this.testPromise2(value)
.then(result => {
observer.next(result);
observer.complete();
})
.catch(err => {
observer.error(err);
observer.complete();
});
});
}
testObservableNext(value: number): Observable<boolean> {
console.log("create Observable Next");
return Observable.create((observer: Observer<boolean>) => {
console.log("execute Observable Next");
this.testPromise2(value)
.then(result => {
observer.next(result);
setTimeout(() => {
observer.next(result);
observer.complete();
}, 5000);
})
.catch(err => {
observer.error(err)
});
});
}
testPromise(value: number): Promise<boolean> {
console.log("creation");
return new Promise((resolve, reject) => {
console.log("execution");
this.testPromise2(value)
.then(result => {
resolve(result);
})
.catch(reject);
});
}
testPromise2(value: number): Promise<boolean> {
return new Promise((resolve, reject) => {
if (value > 1) {
reject(new Error("testing"));
} else {
resolve(true);
}
});
}
}
HTML 程式碼:
<h2>Example of Promise and Observable </h2>
<br/>
<button (click)="createPromise()">Create Promise</button>
<br/>
<br/>
<button (click)="createObservable()">Create Observable</button>
<br/>
<br/>
<button (click)="subscribeObservable()">Subscribe Observable</button>
<br/>
<br/>
<button (click)="createObservableNext()">Create Observable Next</button>
<br/>
<br/>
<button (click)="createToPromiseByObservable()">Create Promise by Observable</button>
<br/>
在 promise 和 observable 之間哪個更容易使用?所以這裡是這個問題的簡單答案。
Promise 在 Angular 中用於解決非同步操作,當資料來自 API 等外部源時,使用 Observables。
Promise 可以用單個值或一組值來解決,並且 Observables 會隨著時間的推移發出一個或多個值。
因此,在管理 HTTP 搜尋時,Promise 只能處理同一請求的單個響應;但是,如果同一個請求有多個結果,我們必須使用 Observable。
要檢視程式碼的演示,請單擊此處。
Muhammad Adil is a seasoned programmer and writer who has experience in various fields. He has been programming for over 5 years and have always loved the thrill of solving complex problems. He has skilled in PHP, Python, C++, Java, JavaScript, Ruby on Rails, AngularJS, ReactJS, HTML5 and CSS3. He enjoys putting his experience and knowledge into words.
Facebook