回答編集履歴
6
補足
test
CHANGED
@@ -78,3 +78,5 @@
|
|
78
78
|
select {}
|
79
79
|
}
|
80
80
|
```
|
81
|
+
|
82
|
+
これであればsample.txtを書き換えて、ブラウザのボタンを押せば更新した内容をブラウザ側で読めるはずです。
|
5
実装例の解説追記
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
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
56
|
+
failed := js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
56
|
-
|
57
|
+
log.Println("failed")
|
57
|
-
|
58
|
+
ch <- ""
|
58
|
-
|
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
追記への回答案
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
補足
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
補足
test
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
これまでの質問のほとんどがいきなりGoで書こうとしてJS側のコンテキストを考慮できていないという問題を繰り返しています。
|
2
|
+
|
3
|
+
例えば「xhr.onload」はユーザーコードからコールするものではありません。functionを代入すべきフィールドです。
|
2
4
|
|
3
5
|
GoのWASMはJSの知識も要求されるいばらの道なのですが突き進むというのであれば、
|
4
6
|
手順としては以下のものをお勧めします。
|