回答編集履歴

1

追跡サンプルコード追加

2018/08/30 11:59

投稿

hope_mucci
hope_mucci

スコア4447

test CHANGED
@@ -1,3 +1,9 @@
1
+ 追記あり。
2
+
3
+ ---
4
+
5
+
6
+
1
7
  1回目と2回目を判別しているというよりは、「次の処理を1秒待たせている」という解釈が正しいです。
2
8
 
3
9
  asyncFuncDefで返ってくるのはpromiseオブジェクトですが、この関数中で新しいdefferedオブジェクトを作成し、そのdefferedの中の新しいpromiseを返します。
@@ -15,3 +21,65 @@
15
21
  なお、`deferred.resolve("done");`の"done"ですが、これはconsole出力上は何の意味もありません。
16
22
 
17
23
  ちょっとややこしい。
24
+
25
+
26
+
27
+ ### 追跡ログを埋め込んだサンプルコード
28
+
29
+ 実行してコンソールにどんな順番でログが出力されるか確認してください。
30
+
31
+
32
+
33
+ ```jquery
34
+
35
+ //jquery 3.3.1
36
+
37
+ var prevState = new $.Deferred().resolve();
38
+
39
+
40
+
41
+ function asyncFuncDef() {
42
+
43
+ var deferred = new $.Deferred();
44
+
45
+ console.log('asyncFuncDef処理開始');
46
+
47
+ setTimeout(function() {
48
+
49
+ console.log('setTimeoutの中身開始');
50
+
51
+ deferred.resolve("timeout");
52
+
53
+ console.log('setTimeoutの中身終了');
54
+
55
+ }, 1000);
56
+
57
+ console.log('asyncFuncDef処理終了');
58
+
59
+ return deferred.promise();
60
+
61
+ }
62
+
63
+
64
+
65
+ $(document).on("click",function() {
66
+
67
+ console.log('クリック処理開始');
68
+
69
+ console.log('prevState.then処理開始');
70
+
71
+ prevState = prevState.then(function() {
72
+
73
+ console.log("done");
74
+
75
+ return asyncFuncDef();
76
+
77
+ });
78
+
79
+ console.log('prevState.then処理終了');
80
+
81
+ console.log('クリック処理終了');
82
+
83
+ });
84
+
85
+ ```