Почему строковые аргументы пусты при вызове асинхронной функции Rust, скомпилированной в Wasm из JavaScript?
Я использую wasm_bindgen, созданный с помощью wasm-pack. У меня есть функция Rust, которую я предоставляю JS:
#[wasm_bindgen]
pub async fn validate_registration_token(backend_api_domain: String, token: String) -> Result<JsValue, JsValue> {
console::log_1(&"backend_api_domain=".clone().into());
console::log_1(&backend_api_domain.clone().into());
console::log_1(&"token=".clone().into());
console::log_1(&backend_api_domain.clone().into());
let api_endpoint_get_guest_info = format!(
"{backend_api_domain}/weddings/{token}/guests/registration/{registration_token}",
backend_api_domain = backend_api_domain.clone(),
token = token.clone(),
registration_token = registration_token.clone()
);
console::log_1(&api_endpoint_get_guest_info.clone().into());
let res = reqwest::Client::new()
.get(&api_endpoint_get_guest_info)
.send()
.await
.unwrap();
let text = res.text().await.unwrap();
let promise = js_sys::Promise::resolve(&true.into());
let result = wasm_bindgen_futures::JsFuture::from(promise).await.unwrap();
Ok(result)
}
В HTML / JavaScript я вызываю функцию Rust:
<button
type="button"
class="btn submit"
onclick="wam.validate_registration_token('http://localhost:80', 'mytoken')">
Send
</button>
При запуске приложения нажатие на Send
кнопка вызовет мою функцию Rust, но обе String
params кажется пустым / отсутствующим.
Вот трассировка консоли из функции выше:
backend_api_domain=
token=
/weddings//guests/registration/AAAA
Я не уверен, что делаю здесь не так. Следует ли мне изменить способ вызова функции Rust из JavaScript?
1 ответ
Наконец-то удалось исправить проблему! Благодаря помощи пользователя Pauan в ржавчине раздора. Моя ошибка - неправильно инициализировать WASM в JS.
возвращаемое значение из await init('./front_bg.wasm') - это необработанные экспортные данные WebAssembly (которые обычно не следует использовать), тогда как модуль./front.js обертывает эти экспорты, чтобы они работали должным образом, поэтому вам нужно используйте функции, определенные в./front.js, а не функции, возвращаемые из init
см. https://discordapp.com/channels/442252698964721669/443151097398296587/693385649750933564
Изменен тег скрипта в HTML на этот:
import init, * as wam from './front.js';
const run = async () => {
await init('./front_bg.wasm');
window.wam = wam;
};
run();
Спасибо!