我有以下 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
也使调用函数异步:
#[wasm_bindgen]
pub async fn main() {
log("Before");
request_data().await;
log("After");
}
当这个函数导出到 JavaScript 时,它将成为一个返回
Promise
的函数,就像 JS 异步函数一样。