Reasonml支持异步/等待



我一直在介绍ML网站上的JS->原因作弊表。它们非常有帮助,但没有人涵盖现代ES。

中可用的async/await语法

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

推理文档说:

注意:将来我们可能会为JS承诺(异步/等待(提供专用语法。

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

当前(2018年10月(一个"语法提案:async/ategait"拉请"拉请"请求打开,以实施该请求,该请求已开放约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)
};

如果您喜欢Reasonml但想要异步功能,请查看OCAML。他们有一些语法差异,但否则非常相似。理由甚至使用Ocaml的编译器,基本上是OCAML,带有牙套,以使JavaScript开发人员不太害怕。OCAML使用两个异步库:LWT和Jane Street的异步。

最新更新