Javascript ReasonML是否支持异步/等待?

Javascript ReasonML是否支持异步/等待?,javascript,async-await,reason,reasonml,Javascript,Async Await,Reason,Reasonml,我一直在经历这个过程。它们非常有用,但没有一个涵盖现代ES中可用的async/wait语法 这是什么原因 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]; con

我一直在经历这个过程。它们非常有用,但没有一个涵盖现代ES中可用的
async
/
wait
语法

这是什么原因

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));
说:

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


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

如果您喜欢ReasonML,但想要异步功能,请查看OCaml。 但它们在其他方面非常相似。 Reason甚至使用了OCaml的编译器,基本上是带有大括号的OCaml,以减少Javascript开发人员的恐惧。OCaml有两个异步库在使用:和Jane Street的。

目前(2018年10月)有一个开放库来实现这一点,该库已经开放了大约15个月。去年年底,一位开发人员写了一篇关于他们的计划的文章,并指出了在处理一些JavaScript承诺怪癖方面的一些问题。从博客文章中甚至可以看到一个支持异步语法的示例,如下所示:

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)
};

可能吧?有一个名为的语言扩展可以让你这么做。它不支持Windows,只支持Mac和Linux。真遗憾!这使得Reason远不如F#+Fable吸引人。近3年后,您仍然无法将async await与reasonml一起使用,因为BuckleScript还不支持它。您可以使用问题注释中提到的bs let,但repo警告生成的代码性能不太好。我在寻找一种类型安全的方法来编写react代码。现在,基于F#和寓言的Feliz看起来最有希望(参见)。