Source:  Twitter logo

What is the difference between Promise and Observable in Angular?

An example on each would be helpful in understanding both the cases. In what scenario can we use each case?


A Promise handles a single event when an async operation completes or fails.

Note: There are Promise libraries out there that support cancellation, but ES6 Promise doesn't so far.


An Observable is like a Stream (in many languages) and allows to pass zero or more events where the callback is called for each event.

Often Observable is preferred over Promise because it provides the features of Promise and more. With Observable it doesn't matter if you want to handle 0, 1, or multiple events. You can utilize the same API in each case.

Observable also has the advantage over Promise to be cancellable. If the result of an HTTP request to a server or some other expensive async operation isn't needed anymore, the Subscription of an Observable allows to cancel the subscription, while a Promise will eventually call the success or failed callback even when you don't need the notification or the result it provides anymore.

While a Promise starts immediately, an Observable only starts if you subscribe to it. This is why Observables are called lazy.

Observable provides operators like map, forEach, reduce, ... similar to an array

There are also powerful operators like retry(), or replay(), ... that are often quite handy. A list of operators shipped with rxjs

Lazy execution allows to build up a chain of operators before the observable is executed by subscribing, to do a more declarative kind of programming.

1859 users liked answer #0dislike answer #01859
Günter Zöchbauer profile pic
Günter Zöchbauer

Both Promises and Observables provide us with abstractions that help us deal with the asynchronous nature of our applications. The difference between them was pointed out clearly by Günter and @Relu.

Since a code snippet is worth a thousand words, let’s go through the below example to understand them easier.

Thanks @Christoph Burgdorf for the awesome article

Angular uses Rx.js Observables instead of promises for dealing with HTTP.

Suppose that you are building a search function that should instantly show you results as you type. It sounds familiar, but there are a lot of challenges that come with that task.

  • We don't want to hit the server endpoint every time user presses a key. It should flood them with a storm of HTTP requests. Basically, we only want to hit it once the user has stopped typing instead of with every keystroke.
  • Don’t hit the search endpoint with the same query parameters for subsequent requests.
  • Deal with out-of-order responses. When we have multiple requests in-flight at the same time we must account for cases where they come back in unexpected order. Imagine we first type computer, stop, a request goes out, we type car, stop, a request goes out. Now we have two requests in-flight. Unfortunately, the request that carries the results for computer comes back after the request that carries the results for car.

The demo will simply consist of two files: app.ts and wikipedia-service.ts. In a real world scenario, we would most likely split things further up, though.

Below is a Promise-based implementation that doesn’t handle any of the described edge cases.


import { Injectable } from '@angular/core';
import { URLSearchParams, Jsonp } from '@angular/http';

export class WikipediaService {
  constructor(private jsonp: Jsonp) {}

  search (term: string) {
    var search = new URLSearchParams()
    search.set('action', 'opensearch');
    search.set('search', term);
    search.set('format', 'json');
    return this.jsonp
                .get('', { search })
                .then((response) => response.json()[1]);

We are injecting the Jsonp service to make a GET request against the Wikipedia API with a given search term. Notice that we call toPromise in order to get from an Observable<Response> to a Promise<Response>. Eventually end up with a Promise<Array<string>> as the return type of our search method.


// check the plnkr for the full list of imports
import {...} from '...';

  selector: 'my-app',
  template: `
      <h2>Wikipedia Search</h2>
      <input #term type="text" (keyup)="search(term.value)">
        <li *ngFor="let item of items">{{item}}</li>
export class AppComponent {
  items: Array<string>;

  constructor(private wikipediaService: WikipediaService) {}

  search(term) {
                         .then(items => this.items = items);

There is not much of a surprise here either. We inject our WikipediaService and expose its functionality via a search method to the template. The template simply binds to keyup and calls search(term.value).

We unwrap the result of the Promise that the search method of the WikipediaService returns and expose it as a simple array of strings to the template so that we can have *ngFor loop through it and build up a list for us.

See the example of Promise-based implementation on Plunker

Where Observables really shine

Let’s change our code to not hammer the endpoint with every keystroke, but instead only send a request when the user stopped typing for 400 ms

To unveil such super powers, we first need to get an Observable<string> that carries the search term that the user types in. Instead of manually binding to the keyup event, we can take advantage of Angular’s formControl directive. To use this directive, we first need to import the ReactiveFormsModule into our application module.


import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { ReactiveFormsModule } from '@angular/forms';

  imports: [BrowserModule, JsonpModule, ReactiveFormsModule]
  declarations: [AppComponent],
  bootstrap: [AppComponent]
export class AppModule {}

Once imported, we can use formControl from within our template and set it to the name "term".

<input type="text" [formControl]="term"/>

In our component, we create an instance of FormControl from @angular/form and expose it as a field under the name term on our component.

Behind the scenes, term automatically exposes an Observable<string> as property valueChanges that we can subscribe to. Now that we have an Observable<string>, overcoming the user input is as easy as calling debounceTime(400) on our Observable. This will return a new Observable<string> that will only emit a new value when there haven’t been coming new values for 400 ms.

export class App {
  items: Array<string>;
  term = new FormControl();
  constructor(private wikipediaService: WikipediaService) {
              .debounceTime(400)        // wait for 400 ms pause in events
              .distinctUntilChanged()   // ignore if next search term is same as previous
              .subscribe(term => => this.items = items));

It would be a waste of resources to send out another request for a search term that our application already shows the results for. All we have to do to achieve the desired behavior is to call the distinctUntilChanged operator right after we called debounceTime(400)

See the example of Observable implementation on Plunker

For dealing with out-of-order responses, please check the full article

As far as I am using HTTP in Angular, I agree that in the normal use cases there is not much difference when using Observable over Promise. None of the advantages are really relevant here in practice. I hope I can see some advanced use case in the future :)

Learn more

388 users liked answer #1dislike answer #1388
trungk18 profile pic

Both Promises and Observables will help us work with the asynchronous functionalities in JavaScript. They are very similar in many cases, however, there are still some differences between the two as well, promises are values that will resolve in asynchronous ways like HTTP calls. On the other hand, observables deal with a sequence of asynchronous events. The main differences between them are listed below:


  • having one pipeline
  • usually only use with async data return
  • not easy to cancel


  • are cancellable
  • are re-triable by nature such as retry and retryWhen
  • stream data in multiple pipelines
  • having array-like operations like map, filter etc
  • can be created from other sources like events
  • they are functions, which could be subscribed later on

Also, I've created the graphical image for you below to show the differences visually:

292 users liked answer #2dislike answer #2292
Alireza profile pic

There is one downside of Observables missing in the answers. Promises allow to use the ES7 async/await functions. With them you can write asynchronous code like it would be a synchronous function call, so you don't need callbacks anymore. The only possibility for Observables to do this, is to convert them to Promises. But when you convert them to Promises, you can only have one return value again:

async function getData(){
    const data = await observable.first().toPromise();
    //do stuff with 'data' (no callback function needed)

Further reading: How can I `await` on an Rx Observable?

102 users liked answer #3dislike answer #3102
besserwisser profile pic


  1. Definition: Helps you run functions asynchronously, and use their return values (or exceptions), but only once when executed.
  2. Not lazy
  3. Not cancellable (there are Promise libraries out there that support cancellation, but ES6 Promise doesn't so far). The two possible decisions are
    • Reject
    • Resolve
  4. Cannot be retried (Promises should have access to the original function that returned the promise to have a retry capability, which is a bad practice)


  1. Definition: Helps you run functions asynchronously, and use their return values in a continuous sequence (multiple times) when executed.
  2. By default, it is lazy as it emits values when time progresses.
  3. Has a lot of operators which simplifies the coding effort.
  4. One operator retry can be used to retry whenever needed, also if we need to retry the observable based on some conditions retryWhen can be used.

Note: A list of operators along with their interactive diagrams is available here at ****

86 users liked answer #4dislike answer #486
Aravind profile pic

Promises and Observables both handle the asynchronous call only.

Here are the differences between them:


  1. Emits multiple values over a period of time
  2. Is not called until we subscribe to the Observable
  3. Can be canceled by using the unsubscribe() method
  4. Provides the map, forEach, filter, reduce, retry, and retryWhen operators


  1. Emits only a single value at a time

  2. Calls the services without .then and .catch

  3. Cannot be canceled

  4. Does not provide any operators

48 users liked answer #5dislike answer #548
sudheer nunna profile pic
sudheer nunna

I have summarized the differences below,


  1. Observable is just a function that takes an observer and returns a function Observer: an object with next, error.
  2. Observer allows to subscribe/unsubscribe to its data stream, emit next value to the observer, notify the observer about errors and inform the observer about the stream completion
  3. Observer provides a function to handle next value, errors and end of stream (UI events, http responses, data with web sockets).
  4. Works with multiple values over time
  5. It is cancel-able/retry-able and supports operators such as map, filter, reduce, etc.
  6. Creating an Observable can be -Observable.create() - returns Observable that can invoke methods on -Observer Observable.from() - converts an array or iterable into -Observable Observable.fromEvent() - converts an event into Observable -Observable.fromPromise() - converts a Promise into Observable -Observable.range() - returns a sequence of integers in the specified range


  1. A promise represents a task that will finish in the future;

  2. Promises become resolved by a value;

  3. Promises get rejected by exceptions;

  4. Not cancellable and it returns a single value

  5. A promise expose a function (then)

    -then returns a new promise;

    -allows for the attachment of that will be executed based on state;

    -handlers are guaranteed to execute in order attached;

33 users liked answer #6dislike answer #633
Sajeetharan profile pic

I believe all the other answers should clear your doubts. Nevertheless, I just wanted to add that observables are based on functional programming, and I find very useful the functions that come with it like map, flatmap, reduce, zip. The consistency the web achieves especially when it depends on API requests is a brutal improvement.

I strongly recommend this documentation, since it's the official documentation of reactiveX and I find it to be the most clear out there.

If you want to get into observables, I would suggest this 3-part post:

Although it's meant for RxJava, the concepts are the same, and it's really well explained. In reactiveX documentation, you have the equivalences for each function. You must look for RxJS.

27 users liked answer #7dislike answer #727
Marc Pérez profile pic
Marc Pérez

I've just dealt with an issue where Promises were the best solution, and I'm sharing it here for anyone stumbling across this question in the event it's useful (this was exactly the answer I was looking for earlier):

In an Angular2 project I have a service that takes some parameters and returns a value list to populate drop down menus on a form. When the form component initializes, I need to call the same service multiple times with different parameters to define a number of different dropdown menus, however if I simply queue up all the variables to call the service, only the last one succeeds and the rest error out. The service fetching from the database could only handle one request at a time.

The only way to successfully populate all the dropdown menu variables was to call the service in a way that prevented a new request from being processed until the last request was finished, and the Promise / .then mechanism solved the problem nicely.

  fetchValueList(listCode): Promise<any> {
      return this.dataSvc.getValueList(listCode, this.stateSvc.currentContext, this.stateSvc.currentLanguageCode)
          .map(response => response.json())

  initializeDropDowns() {
          .then(data => {
              this.firstValList = data;
              return this.fetchValueList('Second-Val-List')
          }).then(data => {
              this.secondValList = data;
              return this.fetchValueList('Third-Val-List')
          }).then(data => {
              this.thirdValList = data;
          })  }

I defined the functions in the component, and then called initializeDropDowns() in ngOnInit.

The fetchValueList function returns a Promise, so the first call passes the first listCode and when the Promise resolves, the return value is in the data variable in the .then block where we can assign it to the this.firstValList variable. As the function has returned data, we know the service has finished and it's safe to call again with the second listCode, the return value is in the data variable in the next .then block and we assign it to the this.secondValList variable.

We can chain this as many times as required to populate all the variables, and on the last code block we simply omit the return statement and the block terminates.

This is a very specific use case where we have a single service that needs to be called multiple times as the component initializes, and where the service has to complete its fetch and return a value before it can be called again, but in this case, the Promise / .then method was ideal.

26 users liked answer #8dislike answer #826
Stephen R. Smith profile pic
Stephen R. Smith


  • Both Promises and Observables help us dealing with asynchronous operations. They can call certain callbacks when these asynchronous operations are done.
  • A Promise can only handle one event, Observables are for streams of events over time
  • Promises can't be cancelled once they are pending
  • Data Observables emit can be transformed using operators

You can always use an observable for dealing with asynchronous behaviour since an observable has the all functionality which a promise offers (+ extra). However, sometimes this extra functionality that Observables offer is not needed. Then it would be extra overhead to import a library for it to use them.

When to use Promises:

Use promises when you have a single async operation of which you want to process the result. For example:

var promise = new Promise((resolve, reject) => {
  // do something once, possibly async
  // code inside the Promise constructor callback is getting executed synchronously

  if (/* everything turned out fine */) {
    resolve("Stuff worked!");
  else {
    reject(Error("It broke"));

//after the promise is resolved or rejected we can call .then or .catch method on it

promise.then((val) => console.log(val))      // logs the resolve argument
       .catch((val) => console.log(val));    // logs the reject argument

So a promise executes some code where it either resolves or rejects. If either resolve or reject is called the promise goes from a pending state to either a resolved or rejected state. When the promise state is resolved the then() method is called. When the promise state is rejected, the catch() method is called.

When to use Observables:

Use Observables when there is a stream (of data) over time which you need to be handled. A stream is a sequence of data elements which are being made available over time. Examples of streams are:

  1. User events, e.g. click, or keyup events. The user generates events (data) over time.
  2. Websockets, after the client makes a WebSocket connection to the server it pushes data over time.

In the Observable itself is specified when the next event happened, when an error occurs, or when the Observable is completed. Then we can subscribe to this observable, which activates it and in this subscription, we can pass in 3 callbacks (don't always have to pass in all). One callback to be executed for success, one callback for error, and one callback for completion. For example:

const observable = Rx.Observable.create(observer => {
  // create a single value and complete

  x => console.log('onNext: %s', x),   //  success callback
  e => console.log('onError: %s', e),  //  error callback
  () => console.log('onCompleted')     //  completion callback

// first we log: onNext: 1
//  then we log: onCompleted

When creating an observable it requires a callback function which supplies an observer as an argument. On this observer, you then can call onNext, onCompleted, onError. Then when the Observable is subscribed to it will call the corresponding callbacks passed into the subscription.

26 users liked answer #9dislike answer #926
Willem van der Veen profile pic
Willem van der Veen


  • Provide a single future value;
  • Not lazy;
  • Not cancellable;


  • Emits multiple values over time;
  • Lazy;
  • Cancellable;
  • Supports map, filter, reduce and similar operators

You can use promises instead of observables when calling HTTP in Angular if you wish.

24 users liked answer #10dislike answer #1024
Iosua Sipos profile pic
Iosua Sipos

Promise - Provides a single future value. Not lazy. Not cancel-able. It will either reject or resolve.

Observable - Provides multiple future values. Lazy. Cancel-able. It provides other methods, like map, filter, and reduce.

15 users liked answer #11dislike answer #1115
Gajender Singh profile pic
Gajender Singh

Promise emits a single value while Observable emits multiple values. So, while handling a HTTP request, Promise can manage a single response for the same request, but what if there are multiple responses to the same request, then we have to use Observable. Yes, Observable can handle multiple responses for the same request.


const promise = new Promise((data) =>
{ data(1);
  data(3); })
.then(element => console.log(‘Promise ‘ + element));


Promise 1


const observable = new Observable((data) => {;;;
}).subscribe(element => console.log('Observable ' + element));


Observable 1
Observable 2
Observable 3
14 users liked answer #12dislike answer #1214
Yogesh Waghmare profile pic
Yogesh Waghmare

Promise vs Observable similarity first

  1. Both are used to handle async code.

  2. Please look for the promise example. The promise constructor passes a resolve reference function which will get called when it gets called with some value upon completion of some async task.

    const promise = new Promise(resolve => {
      setTimeout(() => {
        resolve("Hello from a Promise!");
      }, 2000);
    promise.then(value => console.log(value));
  3. Observable example now. Here we also pass a function to observable - an observer to handle the async task. Unlike resolve in the promise, it has the following method and subscribes in place of then.

  4. So both handles async tasks. Now let's see the difference.

    const observable = new Observable(observer => {
      setTimeout(() => {'Hello from a Observable!');
      }, 2000);
    observable.subscribe(value => console.log(value));

Promise vs Observable difference


  1. It resolves or reject a single value and can handle a single value async task at a time.
  2. A promise once resolved the async value it completes, can no longer be used.its just one-time use and here it falls short.
  3. Not cancellable
  4. No rxjs support for operators.


  1. ability to emit multiple asynchronous values.

  2. Used to handle the stream of events or values. Consider you have an array of numerous tasks or values, and you want every time value is inserted into this it should be handled automatically. Anytime you push a value into this array, all of its subscribers will receive the latest value automatically.

  3. Observables are useful for observing input changes, repeated interval, broadcast values to all child components, web socket push notifications, etc.

  4. Can be cancelled using unsubscribe method anytime.

  5. One more last good part that promise that has is support for rxjs operators. You have many pipe operators majorly map, filter, switchMap, combineLatest, etc. to transform observable data before subscribing.

13 users liked answer #13dislike answer #1313
ramesh sharma profile pic
ramesh sharma

A Promise emits a single event when an async activity finishes or fails.

An Observable is like a Stream (in many languages) and permits to pass at least zero or more events where the callback is required for every event.

Frequently Observable is preferred over Promise since it gives the highlights of Promise and more. With Observable it doesn't matter if you need to handle 0, 1, or various events. You can use the similar API for each case.

Promise: promise emits a single value

For example:

const numberPromise = new Promise((resolve) => {

numberPromise.then(value => console.log(value));
// still prints only 5

Observable: Emits multiple values over a period of time

For example:

  const numberObservable = new Observable((observer) => {;;

numberObservable.subscribe(value => console.log(value));
// prints 5 and 10

we can think of an observable like a stream which emits multiple values over a period of time and the same callback function is called for each item emitted so with an observable we can use the same API to handled asynchronous data. whether that data is transmitted as a single value or multiple values over some stretch of time.


  • A promise is Not Lazy
  • A Promise cannot be cancelled


  • Observable is Lazy. The "Observable" is slow. It isn't called until we are subscribed to it.
  • An Observable can be cancelled by using the unsubscribe() method
  • An addition Observable provides many powerful operators like map, foreach, filter, reduce, retry, retryWhen etc.

Angular Promises vs Observables

10 users liked answer #14dislike answer #1410
DeC profile pic

Let's say you want to go to the beach. You have to make a decision based on weather. You have three ways:

  1. You look outside and see the raindrops, so you change your mind. This is a synchronized operation. You stopped what you were doing, went to check the outside, got the result and then got back to what you were doing.

  2. You ask your brother who is next to you to check the weather conditions for today. While he is checking the weather, you still keep doing what you were doing. This is an async operation. You gave a task to your brother and waiting for the promise resolved. in this case, you are getting one response and after you get your response, you no longer get any update.

  3. This time, you turn on a radio and listening to a weather channel that broadcasts weather conditions 24/7. In this scenario, instead of getting one single response, the response is ongoing. This response is like a subscription to an observable. the observable is the "weather" and the subscription is the "radio signals that keep you updated". As long as your radio is on, you are getting every available update. You are not missing any information until you turn off the radio. When you turn off the radio, it means "you unsubscribed".

10 users liked answer #15dislike answer #1510
Yilmaz profile pic

Both Promises and Observables help us dealing with asynchronous operations. They can call certain callbacks when these asynchronous operations are done.

Angular uses Observables which is from RxJS instead of promises for dealing with HTTP

Below are some important differences in promises & Observables.

8 users liked answer #16dislike answer #168
Srikrushna profile pic

Short answer:

Observable is better. It has all Promises features plus extra features.

Long answer:


  • One time use "Return data once"
  • No cancel
  • One listener
  • No socket support


  • Return data many times as data change
  • Support cancel
  • Support socket
  • Support many listeners and notify them when data change
  • Support map, filter, and reduce
8 users liked answer #17dislike answer #178
Amr Ibrahim profile pic
Amr Ibrahim

Below are some important differences in promises & Observables.


  • Emits a single value only
  • Not cancellable
  • Not sharable
  • Always asynchronous


  • Emits multiple values
  • Executes only when it is called or someone is subscribing
  • Can be cancellable
  • Can be shared and subscribed that shared value by multiple subscribers. And all the subscribers will execute at a single point of time.
  • possibly asynchronous

For better understanding refer to the

6 users liked answer #18dislike answer #186
Bikram profile pic


An Async Event Handler - The Promise object represents the eventual completion (or failure) of an asynchronous operation, and its resulting value.

Syntax: new Promise(executor);

For example:

var promise_eg = new Promise(function(resolve, reject) {
  setTimeout(function() {
  }, 300);

promise_eg.then(function(value) {
  // expected output: "foo"


About Promise:

It has one pipeline, so it will return values only once when it’s called. It’s a one-way handler, so once called you may not able to cancel. Useful syntax you can play around, when() and then().


Observables are lazy collections of multiple values over time. It’s really a great approach for async operations. It can be done with rxjs which has cross-platform support, can be used with Angular/React, etc.

It acts like stream liner and can be multi pipeline. So once defined, you can subscribe to get return results in many places.

Syntax: import * as Rx from "@reactivex/rxjs"; to init:

Rx.Observable.fromEvent(button, "click"),


To subscribe: RxLogger.getInstance();

For example:

import { range } from 'rxjs';
import { map, filter } from 'rxjs/operators';

range(1, 200).pipe(
  filter(x => x % 2 === 1),
  map(x => x + x)
).subscribe(x => console.log(x));

Since it supports multi pipeline, you can subscribe to the result in a different location,

It has many more possibilities than promises.


It has more possibilities, like map, filter, pipe, map, concatMap, etc.

6 users liked answer #19dislike answer #196
Mohideen bin Mohammed profile pic
Mohideen bin Mohammed

I see a lot of people using the argument that Observable are "cancellable" but it is rather trivial to make Promise "cancellable"

function cancellablePromise(body) {
  let resolve, reject;
  const promise = new Promise((res, rej) => {
    resolve = res; reject = rej;
    body(resolve, reject)
  promise.resolve = resolve;
  promise.reject = reject;
  return promise

// Example 1: Reject a promise prematurely
const p1 = cancellablePromise((resolve, reject) => {
  setTimeout(() => resolve('10', 100))

p1.then(value => alert(value)).catch(err => console.error(err))
p1.reject(new Error('denied')) // expect an error in the console

// Example: Resolve a promise prematurely
const p2 = cancellablePromise((resolve, reject) => {
  setTimeout(() => resolve('blop'), 100)

p2.then(value => alert(value)).catch(err => console.error(err))
p2.resolve(200) // expect an alert with 200
5 users liked answer #20dislike answer #205
Batiste Bieler profile pic
Batiste Bieler

Something I ran into that wasn't apparent from a first reading of the tutorial and documentation was the idea of multicasting.

Make sure you're aware that by default, multiple subscriptions will trigger multiple executions in an Observable. Multiple subscriptions to a single HTTP call Observable will trigger multiple identical HTTP calls unless you .share() (enable multicasting).

A promise forces you to deal with one thing at a time, unwrap its data, handle exceptions, has language support for cool things like async/await, and is pretty bare-bones otherwise.

An Observable has lots of bells and whistles, but you need to understand the power you're working with or it can be misused.

5 users liked answer #21dislike answer #215
rpgFANATIC profile pic

While the Günter Zöchbauer's answer is good in general, I don't think it emphasises that when dealing with Angular Components you almost always want to use an Observable because it supports cancellation. Promises cannot be cancelled and will resolve even if your component is destroyed. Angular tends to be forgiving until it's not.

For example, any manual change detection on a destroyed component will cause an exception:

ngOnInit() {
  // Promise API
  this.service.getData().then(d => { = d;

  // Observable API
  this.service.getData().pipe(takeUntil(this.unsubscribe)).subscribe((d) => { = d;

If your component is destroyed before the promise is resolved, you'll get an attempt to use destroyed view error when the promise is resolved.

Alternatively, if you use observables with the takeUntil pattern, then as soon as your component is destroyed the subscription will be cancelled.

This is a bit of a contrived example, but executing code for a component that is destroyed is probably going to lead to bugs.

5 users liked answer #22dislike answer #225
shusson profile pic
  1. A Promise is eager, whereas an Observable is lazy.
  2. A Promise is always asynchronous, while an Observable can be either synchronous or asynchronous.
  3. A Promise can provide a single value, whereas an Observable is a
    stream of values (from 0 to multiple values).
  4. You can apply RxJS operators to an Observable to get a new tailored stream.
5 users liked answer #23dislike answer #235
Yogesh Waghmare profile pic
Yogesh Waghmare

Promise: is an ES6 feature that deals with async code which executes immediately on the creation that can only emit a single value at the time and are not cancelable. With modern applications and the complexity of the functionality needs, it will be necessary to implement complex code, if in the case we are dealing to execute many promises at the same time, or filter before execution or make some transformation:

myPromise.then((resolvedValue) => {
}, (error) => {

Observable: is an Object provided by the Rxjs library that helps us to work with reactive programming in JavaScript applications, which provides chaining and subscription to handle complex applications having the advantage to be cancelable, providing many values at the same time. In addition, we can benefit from applying chaining of other operators like retry(), map(), filter(), switchMap(), etc. which helps to deal with complex use cases and heavy user interfaces.

Example instant search:

search(terms: Observable<string>) {
    return terms.pipe(
      switchMap((term) => this.searchEntries(term))

Example many APIS calls in parallel:

let character = this.http.get('');
    let characterHomeworld = this.http.get(

    forkJoin([character, characterHomeworld]).subscribe((results) => {
      console.log('result °', results[0]);
      console.log('result 1', results[1]);
4 users liked answer #24dislike answer #244
Rebai Ahmed profile pic
Rebai Ahmed

The basic difference between observable and promises are:

3 users liked answer #25dislike answer #253
Chirag profile pic
  1. Promises are focused only for single values or resolves. Observables are stream of data.

  2. Observables can be canceled, but promises can't be canceled.

The least known one, at least to me is:

  1. Promises are always of asynchronous nature, but observables can be both synchronous and asynchronous.

If you want to read about it in detail, I wrote a blog post following on this answer - The 4 differences between Observables and Promises in JavaScript

3 users liked answer #26dislike answer #263
Vignesh profile pic

One more difference: Global vs. Imported

Promise is a standard built-in object, and you can use it directly. Check the browser support here.

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('ready with out any installation');
  }, 300);

.then(value => { console.log(value) })
.catch(err => { console.log(err) });

Observable, Reactive Extensions for JavaScript need RxJS installation & import before use

import { Observable } from 'rxjs';
2 users liked answer #27dislike answer #272
Anulal S profile pic
Anulal S

Observables and Promises are helping us to work with the asynchronous functionalities in JavaScript/TypeScript. They are very similar in many cases, however, there are still some differences between them.

0 users liked answer #28dislike answer #280
FAISAL profile pic

A Promise handles a single event when an async operation completes or fails.

Promises are auto-executed in the application while observables are lazy. We have to subscribe observables to return the data.

We cannot unsubscribe promises. They will execute every time in contrast to Observables that can be unsubscribed.

0 users liked answer #29dislike answer #290
ANKIT MISHRA profile pic

Copyright © 2022 QueryThreads

All content on Query Threads is licensed under the Creative Commons Attribution-ShareAlike 3.0 license (CC BY-SA 3.0).