Docs / Language Manual / Async & Promise

Async & Promise

Support for async and await is added in compiler version 10.1. The majority of existing code is based on promises. The new Promise API bindings make async code look better than with old promises.

Promise (new)

Our up to date Promise bindings are currently not part of the the standard library. For now, please install them separately:

npm install @ryyppy/rescript-promise

In your bsconfig.json:

{ "bs-dependencies": ["@ryyppy/rescript-promise"] }

Alternatively you may vendor the Promise.res / Promise.resi files files in your app codebase if you want to have more control.

You can find the APIs and full usage examples here.

Promise (legacy)

Note: The Js.Promise bindings are following the outdated data-last convention from a few years ago. We kept those APIs for backwards compatibility, so for now please use rescript-promise until we upstream the new bindings to our standard library.

ReScript has built-in support for JavaScript promises. The 3 functions you generally need are:

  • Js.Promise.resolve: 'a => Js.Promise.t('a)

  • Js.Promise.then_: ('a => Js.Promise.t('b), Js.Promise.t('a)) => Js.Promise.t('b)

  • Js.Promise.catch: (Js.Promise.error => Js.Promise.t('a), Js.Promise.t('a)) => Js.Promise.t('a)

Additionally, here's the type signature for creating a promise on the ReScript side:

Js.Promise.make: ( ( ~resolve: (. 'a) => unit, ~reject: (. exn) => unit ) => unit ) => Js.Promise.t<'a>

This type signature means that make takes a callback that takes 2 named arguments, resolve and reject. Both arguments are themselves uncurried callbacks (with a dot). make returns the created promise.


Using the pipe operator:

ReScriptJS Output
let myPromise = Js.Promise.make((~resolve, ~reject) => resolve(. 2))

myPromise->Js.Promise.then_(value => {
  Js.Promise.resolve(value + 2)
}, _)->Js.Promise.then_(value => {
  Js.Promise.resolve(value + 3)
}, _)->Js.Promise.catch(err => {
  Js.log2("Failure!!", err)
}, _)