ReasonML是否支持async/await?

4
我一直在阅读 Reason ML 网站上的 JS -> Reason cheatsheet。它们非常有帮助,但没有涵盖现代 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));

1
可能是 promises - Icepickle
有一种语言扩展叫做 bs-let,它可以让你做到这一点。 - Marko Grdinić
它不支持Windows,只支持Mac和Linux。 - Marko Grdinić
3个回答

4

ReasonML文档中说:

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

这意味着它目前不支持async/await。


1
真遗憾!这使得 Reason 相比 F# + Fable 不那么吸引人。 - sdgfsdh
将来已近3年,因为BuckleScript尚未支持它,你仍然不能在Reasonml中使用async-await。正如该问题的评论中提到的那样,您可以使用bs-let,但是该存储库警告生成的代码性能不佳。 我一直在寻找一种类型安全的编写React代码的方法。现在,基于F#和Fable的Feliz看起来最有前途(请参见https://github.com/Zaid-Ajaj/Feliz)。 - David

2
目前(2018年10月),有一个"语法提案:async/await" Pull Request正在开放,已经持续了大约15个月。去年底,其中一位开发者写了一篇博客文章,介绍他们的计划,并指出处理某些JavaScript Promise怪异性的问题。从博客文章中甚至可以看到一个支持async语法的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)
};

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接