[Rust] Pass a JavaScript Function to WebAssembly and Invoke it from Rust

In some cases it’s useful to be able to invoke a JavaScript function inside Rust. This session showcases how this can be done, by passing along our JavaScript functions to the WebAssembly module instantiation.

First let‘s create a function in js:

      const appendNumberToBody = (number) => {
        const text = document.createTextNode(number);
        document.body.appendChild(text);
      }

Wrap this function into a single object which contains ‘env‘:

      const importObject = {
        env: {
          appendNumberToBody: appendNumberToBody
        }
      };

When we load wasm, we can pass in the object:

WebAssembly.instantiateStreaming(fetch("utils.gc.wasm"), importObject)

It return a promise, we can run the exported function return by wasm inside the promise.

Now we are going to create a function in Rust:

extern {
    fn appendNumberToBody(x: u32);
}

#[no_mangle]
pub extern fn run() {
    unsafe { // we need to wrap with unsafe if getting the passed in value from third party
        appendNumberToBody(42);
    }
}

We exprot ‘run‘ function, then we can invoke it inside promise:

      WebAssembly.instantiateStreaming(fetch("utils.gc.wasm"), importObject)
      .then(wasmModule => {
          wasmModule.instance.exports.run();
        });

---------

Full code: Github

index.html:

<!DOCTYPE html>
<html>
  <head>
    <script> 

      // pass the data from Js to Rust
      const appendNumberToBody = (number) => {
        const text = document.createTextNode(number);
        document.body.appendChild(text);
      }

      const importObject = {
        env: {
          appendNumberToBody: appendNumberToBody,
          alert: alert
        }
      };

      WebAssembly.instantiateStreaming(fetch("utils.gc.wasm"), importObject)
      .then(wasmModule => {
          wasmModule.instance.exports.run();
        });
    </script>
  <head>
  <body></body>
<html>

lib.rs:

extern {
    fn appendNumberToBody(x: u32);
    fn alert(x: u32);
}

#[no_mangle]
pub extern fn run() {
    unsafe {
        appendNumberToBody(42);
        alert(33)
    }
}

原文地址:https://www.cnblogs.com/Answer1215/p/9823954.html

时间: 2024-11-05 18:43:11

[Rust] Pass a JavaScript Function to WebAssembly and Invoke it from Rust的相关文章

[WASM] Call a JavaScript Function from WebAssembly

Using WASM Fiddle, we show how to write a simple number logger function that calls a consoleLog function defined in JavaScript. We then download and run the same function in a local project. WASM Fiddle: https://wasdk.github.io/WasmFiddle/?cvrmt Demo

javascript function对象

<html> <body> <script type="text/javascript"> Function.prototype.get_my_name = function(){ return this; }; var func = function(){ this.my_name = 'function name'; } console.log(func.get_my_name()); console.log(func.my_name);//想明

详解Javascript Function陷阱

Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascript函数有的时候也比较“任性”,你如果不了解它的“性情”,它很可能给你制造出一些意想不到的麻烦(bugs)出来. Javascript Function有两种类型: 1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){

【转】onclick事件与href=&#39;javascript:function()&#39;的区别

href='javascript:function()'和onclick能起到同样的效果,一般来说,如果要调用脚本还是在onclick事件里面写代码,而不推荐在href='javascript:function()' 这样的写法,因为 href 属性里面设置了js代码后,在某些浏览器下可能会引发其他不必要的事件.造成非预期效果. 而且 onclick事件会比 href属性先执行,所以会先触发 onclick 然后触发href,所以如果不想页面跳转,可以设置 onclick里面的js代码执行到最后

javascript (function(){})() 【转】

代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样 的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿 名函数又没看到运行(当然是运行了……),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~).当一个匿名函数被括起来,然后再在后面

JavaScript function函数种类(转)

转自:http://www.cnblogs.com/polk6/p/3284839.html JavaScript function函数种类 本篇主要介绍普通函数.匿名函数.闭包函数 目录 1. 普通函数:介绍普通函数的特性:同名覆盖.arguments对象.默认返回值等. 2. 匿名函数:介绍匿名函数的特性:变量匿名函数.无名称匿名函数. 3. 闭包函数:介绍闭包函数的特性. 1. 普通函数 1.1 示例 1 2 3 function ShowName(name) {     alert(na

JavaScript function函数种类

原文:JavaScript function函数种类 本篇主要介绍普通函数.匿名函数.闭包函数 1.普通函数介绍 1.1 示例 function ShowName(name) { alert(name); } 1.2 Js中同名函数的覆盖 在Js中函数是没有重载,定义相同函数名.不同参数签名的函数,后面的函数会覆盖前面的函数.调用时,只会调用后面的函数. var n1 = 1; function add(value1) { return n1 + 1; } alert(add(n1));//调用

[JavaScript]function expression(函数陈述式) VS declaration (函数运算式)

摘要:[JavaScript]function expression(函数陈述式) VS declaration (函数运算式) 先前写过一篇[Javascript]Call method(调用函数)关于函数声明,这边进阶一下做一个比较. 但在开始前, 先来回忆一下如何自定一个JS函数 How to create JS custom function 第一种 - declaration (函数运算式) function callTest(){ console.log(123); } callTe

Rust初步(三):使用atom搭配racer进行rust编程

在rust.cc社区中有一个关于rust编辑器的讨论(话说很多人要学一个新语言,都会立即考虑编辑器的问题,包括我在内),主要关注的是,智能提示(这个真的太重要了).大家讨论下来有几个选择 1. eclipse 2. vs code(我用过,目前支持语言高亮显示,但没有智能提示,还是不顺手) 3.emacs (GNU的创始人作品,再次向开源致敬) 4.SolidOak (我用过,体验很不好) 5.atom (我最后选用了这个工具,是GitHub出品的,据说VS Code也是基于atom做的实现),