4

我一直在阅读Reason ML 网站上的 JS -> Reason 备忘单。它们非常有用,但没有一个涵盖现代 ES 中可用的async/await语法。

与此等效的 Reason ML 是什么?

import fs from 'mz/fs';

// A cat-like utility
const main = async () => {
  if (process.argv.length != 3) {
    throw new Error('Expected a file-path');
  }
  const path = process.argv[2];
  const content = await fs.readFile(path);
  console.log(content.toString());
};

main().catch(error => console.error(error));
4

3 回答 3

4

ReasonML 文档说:

注意:将来我们可能会为 JS 承诺(async/await)提供专用语法。

这意味着它目前不支持异步/等待。

于 2018-02-15T15:38:27.357 回答
2

目前(2018 年 10 月)有一个“语法提案:async/await”拉取请求开放来实现这个已经开放了大约 15 个月。去年年底,一位开发人员写了一篇关于他们计划的博客文章,并指出了处理一些 JavaScript Promise 怪癖的一些问题。在博客文章中,甚至还有一个支持异步语法的示例Github 存储库,如下所示:

let getThing = () => Js.Promise.make((~resolve, ~reject) => [@bs]resolve(20));
let getOtherThing = () => Js.Promise.make((~resolve, ~reject) => [@bs]resolve(40));

let module Let_syntax = Reason_async.Promise;
let doSomething = () => {
  /* These two will be awaited concurrently (with Promise.all) */
  [%await let x = Js.Promise.resolve(10)
  and y = getThing()];

  [%awaitWrap let z = getOtherThing()];
  x + y + z + 3
};

/* Heyy look we have top-level await!
 * `consume` means "give me this promise, and have the result
 * of this whole expression be ()" */
{
  [%consume let result = doSomething()];
  Js.log(result)
};
于 2018-10-07T01:17:01.143 回答
1

如果您喜欢 ReasonML 但想要异步功能,请查看 OCaml。 它们有一些语法差异,但在其他方面非常相似。Reason 甚至使用了 OCaml 的编译器,并且基本上是带有大括号的 OCaml,以使 Javascript 开发人员不那么害怕。OCaml 有两个正在使用的异步库:Lwt和 Jane Street 的Async

于 2018-07-31T13:24:58.043 回答