Raku 的 Promise 构造与 JavaScript 的 Promise 有多少共同点?

uzl*_*xxx 7 javascript asynchronous rakudo promise raku

我正在学习 JS 异步编程,我忍不住注意到 JS 和 Raku 都有一些同名的异步编程结构,但是我不确定一个知识可以在多大程度上转移到另一个。我尝试阅读JS to Raku ,但关于异步编程的部分大多是贫乏的。

例如,在 Raku 中可以做这样的事情吗?

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(json => console.log(json))
Run Code Online (Sandbox Code Playgroud)

或者如果我想创造自己的承诺,类似这样的事情吗?

function getLanguages() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const success = Math.random() >= 0.5;
            if (success) {
                const languages = ['js', 'perl', 'python', 'raku'];
                resolve(languages);
            }
            else {
                reject(new Error('No languages'));
            }
        }, 0);
    });
}

getLanguages()
.then((languages) => {
    console.log(languages);
})
.catch((error) => {
    console.log(error);
});
Run Code Online (Sandbox Code Playgroud)

Jon*_*ton 9

RakuPromise扮演与 JavaScript 相同的角色:它模拟一个可以异步完成的操作,完成要么成功,要么错误。然而,API 有所不同,以便更普遍地适应 Raku 语言。

在 Raku 中,我们说 aPromise要么被保留(成功完成),要么被破坏(错误完成),而不是被拒绝或解决。我不太确定为什么 JavaScript 中不是这样;我真的从来没有告诉过一个人我已经兑现了对他们的承诺!

人们可以创建一个新的Promiseusing my $p = Promise.new,但它不需要一个函数。相反,人们称$p.keep($value)$p.break($error)$p.vow.keep($value)它们实际上是and的缩写$p.vow.break($error),如果Promise从某种 API 返回对象,通常明智的做法是在返回之前获得誓言 - 保留或破坏 , 的专有权利。Promise

可以使用.then,注意它只需要一个函数,并且该函数传递给它Promise本身,并.result用于访问结果;尝试访问损坏的结果Promise将重新抛出异常。

与 JavaScript 中一样,通常首选使用awaitnot.then代替。async与 JavaScript 不同, Raku 中没有关键字:您可以await在任何地方!只要您位于线程池线程上,整个调用堆栈就会被保存起来,并且线程会被释放以处理其他事情,直到保留Promise并安排继续操作为止。与在 .Net 中一样,您可能会在 .Net 之后进入不同的线程await。您可以await在非池线程(例如主线程)上,然后在Promise.

由于从第一个版本Raku开始就包含Promise在标准库中,异步内置函数完全按照Promise(以及Supply异步值流)提供。例如,setTimeout等价物是Promise.interval($seconds)

总体而言:Raku 中 a 的大致概念Promise会对您很有帮助,但是需要了解不同的 API 和不同的习惯用法。


Sci*_*mon 7

我建议阅读 Raku 文档中的以下页面:

请注意,Raku 没有用于执行 Web 请求的内置库,但有一些选项。

所有这些都会发出阻塞请求,但一个简单的start会将请求变成Promise可以链接的请求。您可能还想查看Cro,它是一个完整的库,用于从头开始构建异步的客户端和服务器端系统。

我希望这足以让您开始。祝你好运。