前提・実現したいこと
現在フロント側にjavascriptを用いて、SNSアプリのようなものを作っています。
ユーザーは他のユーザーの投稿をお気に入り登録でき、お気に入り一覧画面で閲覧できるようにしたいと考えています。
DBには投稿情報(写真管理サイトで管理する写真データのURL含む、一覧表示時に写真管理サイトの該当URLを参照しています)がすべて入ったAコレクション、お気に入り登録した作品についてユーザーIDと投稿ID(Aコレクションで付与される)が入ったBコレクションがあります。
お気に入り一覧画面では
- function Favorites()
Bコレクションから投稿IDを取得、favorite_data_id配列に挿入する。 - function FavoriteDatas()
Aコレクションから全投稿内容を取得、favorite_data_id配列のいずれかとidが一致した投稿をfavorite_datas配列に挿入する。
3. function addToList(now_datas)
引数now_datas配列でfor文を回し、画面上に表示する。
という順序で最初の画面は表示させたいと考えています。
3.function addToList(now_datas)でfavorite_datas配列をそのまま利用しない理由は、絞り込み検索結果表示の際にもaddToList関数を利用したいためです。
発生している問題
配列がfor文で回らないのとPromiseが機能しないときがあるのは別問題だとは思ったのですが、どのような時にfor文で回らないのか、Promiseが機能しないのか判別できなかったので、一度に質問しています。
- 配列がfor文で回らない
必ず起こります。
3.function addToList(now_datas)で引数now_datas配列が回りません。
Promiseが機能しているときにはfor文の直前でnow_datas配列を取得すると、now_datas配列にデータは入っているのですが、インデックス番号を指定してもundefinedになり、for文は回りません。
2. Promiseが機能しない
時々起こります。
今回初めてPromiseを使用しており、まだPromiseが確実に機能する状態のコードを書けたことないのですが、そもそも3.function addToList(now_datas)到達時にfavorite_datas配列が空の状態です。
2.function FavoriteDatas()到達時にfavorite_data_id配列はセットされています。
どちらかだけでも良いので、教えていただけないでしょうか。
該当のソースコード
javascript
1 let favorite_data_id = []; // お気に入り登録してあるworkid 2 let favorite_numbers = 0; // お気に入り登録してある数 3 let favorite_datas = []; // お気に入り登録してある全作品 4 window.onload = allDatas(); // 画面ロード時に実行 5 6 function Favorites() { 7 const url = '/Favorites'; // 通信先 8 const req = new XMLHttpRequest(); // 通信用オブジェクト 9 10 req.onreadystatechange = function() { 11 if(req.readyState == 4 && req.status == 200) { 12 const datas = JSON.parse(req.response); 13 for(let i in datas) { 14 const data = datas[i]; 15 favorite_data_id[favorite_numbers] = data.workid; 16 favorite_numbers++; 17 } 18 } 19 } 20 req.open('GET', url, true); 21 req.send(); 22 } 23 24 // 全データの取得 25 function FavoriteDatas() { 26 console.log(favorite_data_id); 27 const url = '/AllDatas'; // 通信先 28 const req = new XMLHttpRequest(); // 通信用オブジェクト 29 30 req.onreadystatechange = function() { 31 if(req.readyState == 4 && req.status == 200) { 32 const datas = JSON.parse(req.response); 33 all_datas = datas; 34 for(let i in all_datas){ 35 for(let j in favorite_data_id){ 36 if(all_datas[i]._id == favorite_data_id[j]){ 37 favorite_datas[j] = all_datas[i]; 38 } 39 } 40 } 41 } 42 } 43 req.open('GET', url, true); 44 req.send(); 45 } 46 47 // 表示 48 function addToList(now_datas) { 49 for(let i in now_datas){ 50 // 表示 51 } 52 } 53 54 function allDatas(){ 55 new Promise((resolve) => { 56 Favorites(); 57 resolve(); 58 }).then(() => { 59 FavoriteDatas(); 60 }).then(() => { 61 addToList(favorite_datas); 62 }); 63 }
回答2件
あなたの回答
tips
プレビュー