Rust wasm:如何等待 Future 解决

问题描述 投票:0回答:1

我有以下 WASM 代码,其中包含异步函数

request_data
,它对任意 API 执行异步调用并将已解析的 Promise 记录到控制台。为了检查编排情况,我在执行此函数之前和之后进行记录。当然,当我没有指定等待异步函数时,它的输出将记录在我的周围日志之后:

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");
}

当我运行函数

main
时,我在控制台上得到以下输出:

Before
After
<async call result data>

我想要实现的是让

main
函数等到 Future 解析,然后再记录
"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");
}

这只会导致这个输出

Before

所以我的问题是,如何编排

main
函数以获得以下输出:

Before
<async call result data>
After
asynchronous rust webassembly
1个回答
0
投票

也使调用函数异步:

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

当这个函数导出到 JavaScript 时,它将成为一个返回

Promise
的函数,就像 JS 异步函数一样。

© www.soinside.com 2019 - 2024. All rights reserved.