代码之家  ›  专栏  ›  技术社区  ›  tclemment

Tauri中Rust后端的返回值导致Javascript前端未处理的Promise Rejection

  •  0
  • tclemment  · 技术社区  · 1 年前

    我正在使用Tauri实现2048的克隆,在后端使用Rust,在前端使用Javascript。目前,我正在将板从前端与用户的移动一起传递到后端,在那里Rust代码将处理板和用户输入,然后将板返回到前端以显示给用户。

    该板在Javascript中表示为一个二维整数数组。状态保持在前端,所以我将板设置为每次调用后端后从Rust代码返回的任何内容。回调适用于第一次迭代,但在随后的迭代中,Javascript会抛出以下错误:

    Unhandled Promise Rejection: invalid args board for command player_move: invalid type: map, expected an array of length 4

    这是我正在使用的Javascript。

    function player_move() {
      board = invoke("player_move", { input: moveInputEl.value, board: board});
    }
    
    window.addEventListener("DOMContentLoaded", () => {
      moveInputEl = document.querySelector("#player-move-input");
      document.querySelector("#player-move-form").addEventListener("submit", (e) => {
        e.preventDefault();
        player_move();
      });
    });
    

    这是后端的Rust函数:

    #[tauri::command]
    fn player_move(input: &str, mut board: [[i32; BOARD_SIZE]; BOARD_SIZE]) -> [[i32; BOARD_SIZE]; BOARD_SIZE] {
        let dir: Direction = get_direction(input);
        println!("{:#?}", dir);
    
        let mut score = 0;
    
        match dir{
            Direction::Up =>
                for i in 0..BOARD_SIZE{
                    for j in 0..BOARD_SIZE{
                        shift_board(&mut board, &dir, [i, j], &mut score);
                    }
                }
            Direction::Down =>
                for i in (0..BOARD_SIZE).rev(){
                    for j in 0..BOARD_SIZE{
                        shift_board(&mut board, &dir, [i, j], &mut score);
                    }
                }
            Direction::Left =>
                for i in 0..BOARD_SIZE{
                    for j in 0..BOARD_SIZE{
                        shift_board(&mut board, &dir, [i, j], &mut score);
                    }
                }
            Direction::Right =>
                for i in 0..BOARD_SIZE{
                    for j in (0..BOARD_SIZE).rev(){
                        shift_board(&mut board, &dir, [i, j], &mut score);
                    }
                }
            Direction::None => println!("invalid player move")
        }
    
        add_number(&mut board);
    }
    

    我如何返回代表董事会的数组可能有一些问题,但到目前为止,我在谷歌上的搜索毫无结果。

    1 回复  |  直到 1 年前
        1
  •  4
  •   kmdreko    1 年前

    invoke() 返回 Promise ,所以你需要 await 结果。否则,您正试图通过 许诺 而不是下一次调用时的数组。