##やりたいこと
取得した10
個のデータを配列に格納後に処理を行いたい。
やっている(と思う処理)
- APIを叩き10件のデータを取得
- 取得したのuid を使用し、ユーザーネームを取得
- 10件全てのユーザーネームを取得後、それぞれのデータを変数に格納する
- 格納したデータを連想配列に格納していく
- 10件全て格納後、その個数を取得する
やっている(と思う処理)のソース
<script> // 日付をフォーマットする関数 const DateFormat = (get_date) => { const date = new Date(get_date), year = date.getFullYear(), month = date.getMonth() + 1, day = ("0" + date.getDate()).slice(-2), hour = ("0" + date.getHours()).slice(-2), minute = ("0" + date.getMinutes()).slice(-2), PostDate = `${year}年${month}月${day}日 ${hour}時${minute}分`; return PostDate } // ユーザー名を取得する関数 const GetUserName = (get_user_name) => { // PROMISE を返す return new Promise(function (resolve, reject) { const url = `https://versatileapi.herokuapp.com/api/user/${get_user_name}` fetch(url) .then(function (data) { return (data || "null").json(); }).then(function (user) { UserName = user.name; }).catch(function (e) { UserName = '名前が設定されていません'; }).then(function () { resolve(UserName); }); }); } // HTMLに描画するデータを取得する関数 let init_data = []; const GetBaseData = () => { // PROMISE を返す return new Promise(function (resolve, reject) { fetch('https://versatileapi.herokuapp.com/api/text/all') .then(function (data) { return data.json(); }).then(function (tweet) { // 最近の10件を取得する for (let i = tweet.length - 1; i >= tweet.length - 10; --i) { GetUserName(tweet[i]._user_id).then(function (UserName) { let tweet_data = { user_name: UserName, post_date: DateFormat(tweet[i]._created_at), reply_text: tweet[i].in_reply_to_text_id, post_text: tweet[i].text, like_amount: '', } init_data.push(tweet_data) }) } }); resolve(init_data); }); } // HTMLのデータ10個が全て格納さ入れたら実行 Promise.all([GetBaseData(init_data)]) .finally(() => { console.log(init_data.length); }); </script>
起こっている事象
「個数を取得する」処理で0
が取得される
考えたこと
for
で回しているので、1個値が入った瞬間に完了されたと判断される?
→ そうであれば個数は1
になるはずなので、違う。
そもそもpromise
がうまく処理できていない。
→ console
を見ているとどうやらこれっぽい。
ページ表示と同時にinit_data.length
がconsole
に表示され、そこに徐々にデータが格納されている気がする。
試したこと
resolve(init_data);
をfor の中に入れてみた結果的に1
が返ってきたので、「考えたこと」の1つ目は正しい?
つまり、promise
は動いている?
色々、考えてみましたが、promise
の処理が間違ってるのだと思います。
どこでつまずいているか教えていただけますでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/05 06:03