Почему строковые аргументы остаются пустыми при вызове функции asyn c Rust, скомпилированной в Wasm из JavaScript? - PullRequest
1 голос
/ 27 марта 2020

Я использую 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 кажутся пустыми или отсутствуют.

Вот трассировка консоли из функции выше:

backend_api_domain=

token=

/weddings//guests/registration/AAAA

I Я не уверен, что я делаю не так здесь. Должен ли я изменить способ вызова функции Rust с JavaScript?

Вот полный пример кода для воспроизведения

1 Ответ

0 голосов
/ 28 марта 2020

Наконец-то удалось исправить проблему! Благодаря помощи от пользователя 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();

Спасибо!

...