回答編集履歴

1

非同期についての説明

2019/07/16 06:33

投稿

moredeep
moredeep

スコア1507

test CHANGED
@@ -23,3 +23,79 @@
23
23
 
24
24
 
25
25
  [同期および非同期リクエスト](https://developer.mozilla.org/ja/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests)
26
+
27
+
28
+
29
+ 2. の"getCSVより後の処理は非同期実行完了後に実行する。"について追記です。
30
+
31
+ XMLHttpRequestで非同期でデータを取得する場合、普通はどこかのオブジェクトに格納するだけだったり、コールバック関数に取得結果を渡したりすると思います。
32
+
33
+ 非同期なので、その処理の終了は待てません。そのため、getCSVの呼び出し直後にdataにアクセスしても、読み込み完了していなければデータはありません。ただし、呼び出したら直ちに結果が返ってくるほど軽く、回線も早ければ動くかもしれません。
34
+
35
+
36
+
37
+ 最初に非同期実行し、それ以外の処理はコールバックにするサンプル
38
+
39
+ ```
40
+
41
+ function getCSV(callback) {
42
+
43
+ var req = new XMLHttpRequest();
44
+
45
+ req.open("get", "test.csv", true);
46
+
47
+ req.onload = () => {
48
+
49
+ if (req.readyState === 4 && req.status === 200) {
50
+
51
+ callback(convertCSVtoArray(req.responseText)); // これ
52
+
53
+ } else {
54
+
55
+ alert(req.status);
56
+
57
+ }
58
+
59
+ };
60
+
61
+ req.onerror = () => {
62
+
63
+ alert(req.status);
64
+
65
+ };
66
+
67
+ req.send(null);
68
+
69
+ }
70
+
71
+
72
+
73
+ function preInit() {
74
+
75
+ getCSV(init);
76
+
77
+ }
78
+
79
+
80
+
81
+ // getCSV以外をやる
82
+
83
+ function init(data) {
84
+
85
+ for(var i=0;i<data.length;i++){
86
+
87
+ console.log("i : " + i);
88
+
89
+ for(var j = 0; j < data[i].length; j++) {
90
+
91
+ console.log("j : " + j);
92
+
93
+ console.log(data[i][j] + "");
94
+
95
+ }
96
+
97
+ }
98
+
99
+ }
100
+
101
+ ```