异步与 Promise
在编译器 10.1 版本中增加了对 async
和 await
的支持。现有的大部分代码都是基于 promise 的。新的 Promise API 绑定使异步代码看起来比使用旧的 promise 更好。
Promise (新版本)
我们最新的 Promise 绑定目前还不是标准库的一部分,现在,还请单独安装它们:
SHnpm 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 的类型签名:
RESJs.Promise.make: (
(
~resolve: (. 'a) => unit,
~reject: (. exn) => unit
) => unit
) => Js.Promise.t<'a>
这种类型签名意味着 make
接受一个有两个参数的回调函数,参数分别是 resolve
和 reject
。两个参数都是去柯里化的回调函数(注意带点)。make
返回创建的 promise。
用法
使用管道操作符:
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)
}, _)