You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的fetch
  • from-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:10:31