文档 / 语言手册 / Async & Promise
Edit

异步与 Promise

在编译器 10.1 版本中增加了对 asyncawait 的支持。现有的大部分代码都是基于 promise 的。新的 Promise API 绑定使异步代码看起来比使用旧的 promise 更好。

Promise (新版本)

我们最新的 Promise 绑定目前还不是标准库的一部分,现在,还请单独安装它们:

SH
npm install @ryyppy/rescript-promise --save

在你的 bsconfig.json 中加上:

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

如果你想有更多的控制权,你可以在你的应用程序代码库中直接加入 Promise.res/Promise.resi 文件

你可以在这里找到 API 文档和完整的使用例子

Promise (旧版本)

注意Js.Promise 绑定遵循几年前过时的 data-last 约定。我们保留这些 API 是为了向后兼容,现在请使用 rescript-promise 直到我们将新的绑定上传到我们的标准库。

ReScript 内置了对 JavaScript promise 的支持。你通常需要的 3 个函数是:

  • 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)

此外,这里是在 ReScript 端创建 Promise 的类型签名:

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

这种类型签名意味着 make 接受一个有两个参数的回调函数,参数分别是 resolvereject。两个参数都是去柯里化的回调函数(注意带点)。make 返回创建的 promise。

用法

使用管道操作符

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

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