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)
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 和不同的习惯用法。