質問させてください。
下のようなコードを作成しまして、C クラスには外部から json データを取得するメソッドがあり、new A()を実行したときに、そこで取得したデータを C クラスのプロパティに格納したいと思っております。
しかし下のコードだとfecth()が原因のためか中身が空の状態になってしまいます。
javascript
1class A { 2 constructor() { 3 this.b = new B(); 4 } 5} 6 7class B { 8 constructor() { 9 this.c = new C(); 10 } 11} 12 13class C { 14 constructor() { 15 this.data = this.fetchData(); // ← ここのプロパティに取得したデータを入れたいです 16 console.log(this.data); // undefined 17 } 18 19 // json からデータを取得 20 fetchData() { 21 fetch('sample.json') 22 .then(res => { 23 return res.json(); 24 }) 25 } 26} 27 28const a = new A();
そこで下のように非同期処理が終わるのを待つためにawaitを使おうと思ったのですが、コンストラクターにはasyncが使えないらしく、エラーになってしまいます。
javascript
1async constructor() { 2 this.data = await this.fetchData(); 3}
こちらのページを参考に init() を作ってみてもうまくいきませんでした・・・
javascript
1class C { 2 constructor() { 3 this.init(); 4 } 5 6 async init() { 7 this.data = await this.fetchData(); 8 console.log(this.data); 9 } 10 11 fetchData() { 12 fetch('sample.json') 13 .then(res => { 14 return res.json(); 15 }) 16 } 17}
もし解決方法をご存じの方がいらっしゃいましたらご教授いただけると助かります。
よろしくお願いいたします。
追記
gentaro様からのアドバイスをもとに修正しました。
javascript
1class A { 2 constructor(data) { 3 this.b = new B(data); 4 } 5 6 start() { 7 this.b.active(); 8 } 9} 10 11class B { 12 constructor(data) { 13 this.c = new C(data); 14 } 15 16 active() { 17 this.c.hoge(); 18 } 19} 20 21class C { 22 constructor(data) { 23 this.data = data; 24 console.log(this.data); 25 } 26 27 hoge() { 28 // このメソッドで取得したデータを使います 29 } 30} 31 32// json からデータを取得 33fetch('sample.json') 34 .then(res => { 35 return res.json(); 36 }) 37 .then(data => { 38 // Aクラスのインスタンスを生成 39 const a = new A(data); 40 41 // ゲームをスタート 42 a.start(); 43 });
シンプルに非同期で取得したデータをコンストラクタで渡すだけじゃダメなの?
コンストラクタそのものを非同期にするとか、無駄にややこしくしてる気がしますが。
ありがとうございます。
すみません、データをコンストラクタで渡すというのはAクラスの中で fetchData() を実行するということでしょうか…理解不足ですみません
いや、コンストラクタは普通に引数で値をもらうだけ、という意味で。
そのクラスを利用する側がfetchして、取得したデータをコンストラクタの引数に渡せばいいだけで、いま定義したいクラスの内部に非同期とかのややこしいコードを入れる必要あるの?という疑問です。
ご返答ありがとうございます。
実はややこしくなると思い書いてなかったのですが、Aクラスの中に start() というメソッドがありまして、そのメソッドを実行したらゲームがスタートするというものを作っています。
いただいたアドバイスをもとに修正したコードを追記しました。こちらで取得したデータをCクラスのプロパティに入れることはできたのですが、Cクラスのメソッド内でしか使わないプロパティを外から取得しないといけないのでしょうか。Cクラス内で取得から保持まで完結できれば、まとまっていて良さそうなのですがどうでしょうか…
回答2件
あなたの回答
tips
プレビュー