teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答を追記

2015/07/27 11:11

投稿

ngyuki
ngyuki

スコア4516

answer CHANGED
@@ -50,4 +50,47 @@
50
50
  })
51
51
  ```
52
52
 
53
- ひとまず、ajax も絡めた実際のコードを質問に追記すると良いかと思います。
53
+ ひとまず、ajax も絡めた実際のコードを質問に追記すると良いかと思います。
54
+
55
+ ---
56
+
57
+ `$.ajax` の引数の `success` は使わずに `$.ajax` の戻り値の `then` で処理するようにします。
58
+
59
+ `then` に渡すコールバック関数の引数は・・ `success` に渡すコールバック関数の引数とは違った気がするのですが、パッと思い出せないので調べてください。
60
+
61
+ `mark_question` 関数は `then` の戻り値を返します。
62
+
63
+ これらは関数の呼び出し元で Promise を利用するためです。
64
+
65
+ 関数の呼び出し側のコードで Promise を直列につなげます。
66
+
67
+ かなり簡略化しましたが、下記のような感じです。
68
+
69
+ ```javascript
70
+ function mark_question (while_i) {
71
+ return $.ajax({
72
+ type: 'get',
73
+ url: '?'
74
+ })
75
+ .then(function(){
76
+ $('.result').append('<li>' + while_i + '</li>');
77
+ })
78
+ }
79
+
80
+ var defer = $.Deferred().resolve();
81
+
82
+ for (var i = 1; i < 26; i++) {
83
+ (function(){
84
+ var j = i;
85
+ defer = defer.then(function(){
86
+ return mark_question(j)
87
+ });
88
+ }())
89
+ }
90
+ ```
91
+
92
+ もし、これが何をやっているのかわからないなら、jQuery と Deferred(Promise) について学ぶ必要があります。
93
+
94
+ なお、これは↑であげた2番目のコード例です(ajax が直列に実行されるようにする)。
95
+ 3番目の「非同期処理の待ち合わせ」でも、頑張ればできます。
96
+