Golang WASM Async Function

sunday-snippet · Mar 13, 2022 · ~2 min
Sunday Snippet #8 golang WASM async function
Sunday Snippet #8 golang WASM async function
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main

import (
	"fmt"
	"syscall/js"
)

type fn func(this js.Value, args []js.Value) (any, error)

var (
	jsErr     js.Value = js.Global().Get("Error")
	jsPromise js.Value = js.Global().Get("Promise")
)

func asyncFunc(innerFunc fn) js.Func {
	return js.FuncOf(func(this js.Value, args []js.Value) any {
		handler := js.FuncOf(func(_ js.Value, promFn []js.Value) any {
			resolve, reject := promFn[0], promFn[1]

			go func() {
				defer func() {
					if r := recover(); r != nil {
						reject.Invoke(jsErr.New(fmt.Sprint("panic:", r)))
					}
				}()

				res, err := innerFunc(this, args)
				if err != nil {
					reject.Invoke(jsErr.New(err.Error()))
				} else {
					resolve.Invoke(res)
				}
			}()

			return nil
		})

		return jsPromise.New(handler)
	})
}

func argsEvenOdd(this js.Value, args []js.Value) (any, error) {
	if len(args)%2 == 0 {
		return nil, fmt.Errorf("#args is even")
	}
	return "#args is odd", nil
}

func main() {
	js.Global().Set("argsEvenOdd", asyncFunc(argsEvenOdd))
	select {}
}

Test it with

1
2
3
4
5
6
7
argsEvenOdd(1, 2)
		.then(res => console.log(res)) 
		.catch(err => console.error(err)) // will be catched

argsEvenOdd(1)
		.then(res => console.log(res)) // will be logged
		.catch(err => console.error(err))
· · ·

Love This Content?

Any kind of supports is greatly appreciated! Kindly support me via Bitcoin, Ko-fi, Trakteer, or just continue to read another content. You can write a response via Webmention and let me know the URL via Telegraph.

Drop Your Comment Below