関数とプロミスを使用して、ループ処理を行おうとしています。
非同期のループを実現させたく、プロミスを使用した関数のループを実現しようとしていますが、条件処理でresolve
しません。
html
1<!DOCTYPE HTML> 2<html> 3 <head> 4 <script src="lib/jquery-2.2.0.min.js"></script> 5 <script src="js/test.js"></script> 6 </head> 7 <body> 8 <button type="button" onclick="xxx()">クリック</button> 9 </body> 10</html>
<test.js>
js
1let Looptest = function() { 2 this.num = 0; 3} 4 5Looptest.prototype = { 6 aaa: function() { 7 let defer = $.Deferred(); 8 setTimeout(function() { 9 console.log('setTimeout') 10 defer.resolve(); 11 }, 500); 12 return defer.promise(); 13 }, 14 bbb: function() { 15 let self = this; 16 let defer = $.Deferred(); 17 let promise = self.aaa(); 18 promise.done(function() { 19 // 5に達したら、resolveさせたい 20 self.num = self.num + 1; 21 if (self.num < 5) { 22 console.log(self.num) 23 self.bbb(); 24 } 25 else { 26 defer.resolve(); 27 } 28 }); 29 return defer.promise(); 30 } 31} 32 33function xxx() { 34 let lt = new Looptest(); 35 let promise = lt.bbb(); 36 promise.done(function() { 37 console.log('success!'); 38 }) 39}
発生している問題・エラーメッセージ
function xxx()
を実行させると、以下のように途中までのコンソールログは表示されるのですが、最終的ゴールの「success!」が表示されません。
setTimeout 1 setTimeout 2 setTimeout 3 setTimeout 4 setTimeout
試したこと
bbb: function()
内のself.num = self.num + 1;
の位置を変えたりしました。
補足情報
function bbb()
内の条件分岐でelse
を設定しないと、「success!」は表示されるのですが、思ったような順番?に表示されません。
js
1 bbb: function() { 2 let self = this; 3 let defer = $.Deferred(); 4 let promise = self.aaa(); 5 promise.done(function() { 6 self.num = self.num + 1; 7 // 5に達したら、resolveさせたい 8 if (self.num < 5) { 9 console.log(self.num) 10 self.bbb(); 11 } 12 defer.resolve(); 13 }); 14 return defer.promise(); 15 }
setTimeout 1 success! setTimeout 2 setTimeout 3 setTimeout 4 setTimeout
###質問
どのようにすれば正確にresolveして「success!」まで辿り着けるのか、なるべくコードを変えずに、ご指摘をいただけると助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/12 11:11 編集
2019/09/12 11:19
2019/09/12 11:31
2019/09/12 11:40
2019/09/12 23:31
2019/09/13 01:07
2019/09/13 12:25