回答編集履歴

6

補足

2022/11/14 01:28

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -78,3 +78,5 @@
78
78
  select {}
79
79
  }
80
80
  ```
81
+
82
+ これであればsample.txtを書き換えて、ブラウザのボタンを押せば更新した内容をブラウザ側で読めるはずです。

5

実装例の解説追記

2022/11/14 01:27

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -24,6 +24,8 @@
24
24
  というフローでサーバーサイドではややこしいことはしたくないという考え方でしょうか。
25
25
 
26
26
  だとすると、WASMファイルと一緒にスクリプトファイルも静的ファイルサーブするのが最もシンプルな気がします。
27
+
28
+ wasmファイル配信と同じフォルダに「sample.txt」を置いておき、双方静的ファイルサーブの対象とします。
27
29
 
28
30
  ```go
29
31
  package main

4

fix code

2022/11/14 01:25

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -40,24 +40,26 @@
40
40
 
41
41
  func load(fn string) string {
42
42
  ch := make(chan string, 1)
43
- go func() {
44
- fetch.Invoke(fn).Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
43
+ success := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
45
- args[0].Call("text").Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
46
- log.Println("succeeded")
44
+ log.Println("success")
45
+ var received js.Func
46
+ received = js.FuncOf(func(this js.Value, args []js.Value) interface{} {
47
+ defer received.Release()
48
+ log.Println("received")
47
- ch <- args[0].String()
49
+ ch <- args[0].String()
48
- return nil
49
- })).Call("catch", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
50
- log.Println("failed")
51
- ch <- ""
52
- return nil
53
- }))
54
50
  return nil
51
+ })
52
+ args[0].Call("text").Call("then", received)
53
+ return nil
54
+ })
55
+ defer success.Release()
55
- })).Call("catch", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
56
+ failed := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
56
- log.Println("failed")
57
+ log.Println("failed")
57
- ch <- ""
58
+ ch <- ""
58
- return nil
59
+ return nil
59
- }))
60
+ })
60
- }()
61
+ defer failed.Release()
62
+ go fetch.Invoke(fn).Call("then", success).Call("catch", failed)
61
63
  return <-ch
62
64
  }
63
65
 

3

追記への回答案

2022/11/13 14:26

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -14,3 +14,63 @@
14
14
 
15
15
  また、Chrome拡張のつくり方はチュートリアルを済ませましたか?
16
16
  これまでの延長でmanifest.jsonを書けばファイル読み込みができるというわけではありません。
17
+
18
+ # 追記への実装案
19
+
20
+ 1. Monkey処理系ごとWASMにした実装をロード&RUN。
21
+ 2. ブラウザでボタンを押したのを契機にローカルファイルを読み込む。
22
+ 3. ブラウザ側でファイルの内容に従ってMonkeyスクリプト処理する。
23
+
24
+ というフローでサーバーサイドではややこしいことはしたくないという考え方でしょうか。
25
+
26
+ だとすると、WASMファイルと一緒にスクリプトファイルも静的ファイルサーブするのが最もシンプルな気がします。
27
+
28
+ ```go
29
+ package main
30
+
31
+ import (
32
+ "log"
33
+ "syscall/js"
34
+ )
35
+
36
+ var (
37
+ document = js.Global().Get("document")
38
+ fetch = js.Global().Get("fetch")
39
+ )
40
+
41
+ func load(fn string) string {
42
+ ch := make(chan string, 1)
43
+ go func() {
44
+ fetch.Invoke(fn).Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
45
+ args[0].Call("text").Call("then", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
46
+ log.Println("succeeded")
47
+ ch <- args[0].String()
48
+ return nil
49
+ })).Call("catch", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
50
+ log.Println("failed")
51
+ ch <- ""
52
+ return nil
53
+ }))
54
+ return nil
55
+ })).Call("catch", js.FuncOf(func(this js.Value, args []js.Value) interface{} {
56
+ log.Println("failed")
57
+ ch <- ""
58
+ return nil
59
+ }))
60
+ }()
61
+ return <-ch
62
+ }
63
+
64
+ func main() {
65
+ btn := document.Call("createElement", "button")
66
+ btn.Set("textContent", "run")
67
+ btn.Call("addEventListener", "click", js.FuncOf(func(js.Value, []js.Value) interface{} {
68
+ go func() {
69
+ log.Println(load("sample.txt"))
70
+ }()
71
+ return nil
72
+ }))
73
+ document.Get("body").Call("appendChild", btn)
74
+ select {}
75
+ }
76
+ ```

2

補足

2022/11/11 16:06

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  例えば「xhr.onload」はユーザーコードからコールするものではありません。functionを代入すべきフィールドです。
4
4
 
5
+ また、Goのsyscall/jsの実例をもっと見に行ったほうがいいと思います。js.Valueをstringにキャストはできません。js.Value.String()メソッドを使いましょう。
6
+
5
- GoのWASMはJSの知識も要求されるいばらの道なのですが突き進むというのであれば、
7
+ GoのWASMはJSのためのGoの記述を学びつつJSの知識も要求されるいばらの道なのですが突き進むというのであれば、
6
8
  手順としては以下のものをお勧めします。
7
9
 
8
10
  1. まずJavascriptで目的の挙動を実現し動作をしっかり把握する

1

補足

2022/11/11 16:00

投稿

nobonobo
nobonobo

スコア3367

test CHANGED
@@ -1,4 +1,6 @@
1
1
  これまでの質問のほとんどがいきなりGoで書こうとしてJS側のコンテキストを考慮できていないという問題を繰り返しています。
2
+
3
+ 例えば「xhr.onload」はユーザーコードからコールするものではありません。functionを代入すべきフィールドです。
2
4
 
3
5
  GoのWASMはJSの知識も要求されるいばらの道なのですが突き進むというのであれば、
4
6
  手順としては以下のものをお勧めします。