Raku的Promise与JavaScript的Promise共性及用法迁移咨询
JS与Raku的Promise知识迁移及示例实现
核心异同
Raku的Promise和JS的Promise在异步流程控制的核心逻辑上是相通的:都代表异步操作的最终结果,支持链式调用、成功/失败回调(then/catch),但Raku的Promise集成了自身的并发模型(比如与Supply、Start块的结合),语法细节有差异,但JS的异步思维可以直接迁移。
示例1:模拟JS的fetch链式调用
Raku中可以用HTTP::UserAgent的异步方法实现类似逻辑,代码如下:
use HTTP::UserAgent; use JSON::Fast; my $ua = HTTP::UserAgent.new; $ua.get-async('https://jsonplaceholder.typicode.com/todos/1') .then(-> $response { from-json($response.decoded-content) }) .then(-> $json { say $json }) .catch(-> $error { say "请求失败: $error" }); # 等待异步操作完成,避免程序提前退出 await Promise.anyof($*SCHEDULER.keep-alive);
说明:
get-async返回Promise对象,对应JS的fetchfrom-json解析响应内容,对应JS的response.json()
示例2:自定义Promise逻辑
Raku中可以通过Promise类直接构造自定义异步逻辑,对应JS的示例代码如下:
sub get-languages() { return Promise.start({ # 模拟延迟,对应JS的setTimeout(0) sleep 0; my $success = rand >= 0.5; if $success { return ['js', 'perl', 'python', 'raku']; } else { die Error.new('No languages'); } }); } get-languages() .then(-> $languages { say $languages }) .catch(-> $error { say $error.message }); # 等待异步操作完成,避免程序提前退出 await Promise.anyof($*SCHEDULER.keep-alive);
说明:
Promise.start启动异步执行块,对应JS的new Promise((resolve,reject)=>{})- 异步块中正常返回值等价于JS的
resolve,抛出异常等价于reject
内容的提问来源于stack exchange,提问作者uzluisf
相关产品推荐
相关产品推荐

