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

Rust WASM如何等待Future完成以控制异步执行顺序

Rust WASM异步函数执行顺序问题解决

问题描述

我编写了一段Rust WASM代码:异步函数request_data会调用任意API并在控制台打印Promise解析结果;为验证执行顺序,我在调用该函数前后添加了日志输出。未等待异步函数时,控制台输出顺序为Before、After、异步调用结果。

我期望main函数等待Future解析完成后再打印"After",尝试使用futures的block_on方法却陷入无限等待,仅输出Before。需要调整main函数,使控制台输出顺序变为Before、异步调用结果、After。

初始代码

use wasm_bindgen::prelude::*;

#[wasm_bindgen(inline_js = "export async function request_data() { console.log(await <some_async_call>) }")]
extern {
    pub async fn request_data();
}

#[wasm_bindgen(inline_js = "export function log(text) { console.log(text) }")]
extern {
    pub fn log(text: &str);
}

#[wasm_bindgen]
pub fn main() {
    log("Before");
    request_data();
    log("After");
}

尝试的代码(存在问题)

use wasm_bindgen::prelude::*;
use futures::executor::*;

#[wasm_bindgen(inline_js = "export async function request_data() { console.log(await <some_async_call>) }")]
extern {
    pub async fn request_data();
}

#[wasm_bindgen(inline_js = "export function log(text) { console.log(text) }")]
extern {
    pub fn log(text: &str);
}

#[wasm_bindgen]
pub fn main() {
    log("Before");
    block_on(request_data());
    log("After");
}

解决方案

核心原因

在浏览器WASM环境中,futures::executor::block_on会阻塞主线程,而浏览器的异步任务(如API请求)依赖事件循环处理回调。阻塞后事件循环无法推进,导致request_data的异步任务永远无法完成,陷入无限等待。

修正代码

需要使用wasm-bindgen-futures库的spawn_local方法,将异步任务提交到浏览器事件循环中执行,避免阻塞主线程,同时保证执行顺序。

首先在Cargo.toml中添加依赖:

[dependencies]
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"

然后修改代码:

use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::spawn_local;

#[wasm_bindgen(inline_js = "export async function request_data() { console.log(await <some_async_call>) }")]
extern {
    pub async fn request_data();
}

#[wasm_bindgen(inline_js = "export function log(text) { console.log(text) }")]
extern {
    pub fn log(text: &str);
}

#[wasm_bindgen]
pub fn main() {
    log("Before");
    // 将异步逻辑包裹在spawn_local中,确保request_data完成后再打印After
    spawn_local(async {
        request_data().await;
        log("After");
    });
}

执行效果

控制台输出顺序会变为:Before → 异步调用结果 → After

内容的提问来源于stack exchange,提问作者Sebastian Dine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:15:22