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

回答編集履歴

1

回答の追加

2018/08/21 09:12

投稿

Meganezaru
Meganezaru

スコア716

answer CHANGED
@@ -1,3 +1,78 @@
1
1
  同期を取りたいparentでpromiseの終了を待つ必要があると思います。
2
2
 
3
- childBのpromiseをreturnして、parent側で、戻されたpromiseに対して.thenする感じで、処理できませんか?
3
+ childBのpromiseをreturnして、parent側で、戻されたpromiseに対して.thenする感じで、処理できませんか?
4
+
5
+ ### 追記
6
+
7
+ 若干怪しいところがあるかもしれませんが・・・
8
+ 概ねこんなイメージでしょうか?
9
+
10
+ (説明に不要と思った部分は、オリジナルソースから省略しました)
11
+
12
+ ```
13
+ function parent () {
14
+ // parentのDeferredオブジェクト作成
15
+ var parent_dfd = new $.Deferred();
16
+
17
+ // 最終的に `parent` を外のjsから実行した時の return に利用したい
18
+ var result = [];
19
+
20
+ function childA () {
21
+
22
+ var d = new $.Deferred();
23
+
24
+ // Ajax
25
+ $.ajax({
26
+ url: jsonpA,
27
+ })
28
+ .then( function( res ) {
29
+ ...
30
+
31
+ d.resolve();
32
+ });
33
+
34
+ return d.promise();
35
+
36
+ }
37
+
38
+ function childB () {
39
+
40
+ // Ajax
41
+ $.ajax({
42
+ url: jsonpB,
43
+ })
44
+ .then( function ( res ) {
45
+
46
+ $( useB ).each( function (index, el) {
47
+
48
+ result.push({
49
+ 'test01' : el.element01,
50
+ 'test02' : el.element02
51
+ });
52
+
53
+ });
54
+
55
+ // parentのDeferredを解決
56
+ parent_dfd.resolve(result);
57
+
58
+ });
59
+ }
60
+
61
+ childA()
62
+ .then(childB);
63
+
64
+ return parent_dfd.promise();
65
+ }
66
+
67
+ // windowオブジェクトに追加して外部jsから呼び出せるようにする
68
+ window.parent = parent();
69
+
70
+ });
71
+ ```
72
+
73
+ 以下、呼び出し側
74
+ ```
75
+ parent().then(function (result) {
76
+ //resultの処理
77
+ });
78
+ ```