Javascript ReasonML是否支持异步/等待?
我一直在经历这个过程。它们非常有用,但没有一个涵盖现代ES中可用的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
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看起来最有希望(参见)。