前提・実現したいこと
javascriptでTwitter管理システムを作っています。
会員登録を実装中に以下の問題が発生しました。
「createUserData(userData);」の関数の実行完了を待ってから、「monitorLoginStatus()」を実行したいが、順番が逆になる。
signup.jsの抜粋(後半に全文掲載)
js
1twitterOAuth() 2 .then((userData) => { 3 console.log("signup関数の中", userData); 4 createUserData(userData); 5 }) 6 .then(() => { 7 console.log("monitorの前のログ"); 8 monitorLoginStatus().then((loginStatus) => { 9 if (loginStatus) { 10 // location.replace("../../admin.html"); 11 } 12 });
発生している問題・エラーメッセージ
コンソール
signup関数の中 {…省略…} signup.js:13 monitorの前のログ signup.js:17 userId:lOi2qObLIzT4B4oE6DZfpS1qQ0Z2 monitorLoginStatus.js:7 既にユーザーある createUserData.js:30
コンソール(想定している理想の順番)
signup関数の中 {…省略…} signup.js:13 既にユーザーある createUserData.js:30 monitorの前のログ signup.js:17 userId:lOi2qObLIzT4B4oE6DZfpS1qQ0Z2 monitorLoginStatus.js:7
該当のソースコード
signup.js(async/await)
js
1"use strict"; 2 3import createUserData from "../createUserData.js"; 4import twitterOAuth from "../twitterOAuth.js"; 5import monitorLoginStatus from "../monitorLoginStatus.js"; 6 7const twitterSignup = () => { 8 const signUpButton = document.getElementById("signup"); 9 10 signUpButton.addEventListener("click", async () => { 11 const userData = await twitterOAuth(); 12 console.log("signup関数の中", userData); 13 await createUserData(userData); 14 console.log("monitorの前のログ"); 15 monitorLoginStatus().then((loginStatus) => { 16 if (loginStatus) { 17 // location.replace("../../admin.html"); 18 } 19 }); 20 }); 21}; 22 23export default twitterSignup; 24
signup.js
js
1"use strict"; 2 3import createUserData from "../createUserData.js"; 4import twitterOAuth from "../twitterOAuth.js"; 5import monitorLoginStatus from "../monitorLoginStatus.js"; 6 7const twitterSignup = () => { 8 const signUpButton = document.getElementById("signup"); 9 10 signUpButton.addEventListener("click", () => { 11 twitterOAuth() 12 .then((userData) => { 13 console.log("signup関数の中", userData); 14 createUserData(userData); 15 }) 16 .then(() => { 17 console.log("monitorの前のログ"); 18 monitorLoginStatus().then((loginStatus) => { 19 if (loginStatus) { 20 // location.replace("../../admin.html"); 21 } 22 }); 23 }); 24 }); 25}; 26 27export default twitterSignup;
createUserData.js
js
1"use strict"; 2 3const db = firebase.firestore(); 4 5const createUserData = (userData) => { 6 const uids = []; 7 8 db.collection("User") 9 .get() 10 .then((querySnapshot) => { 11 querySnapshot.forEach((doc) => { 12 uids.push(doc.data().uid); 13 }); 14 }) 15 16 .catch((error) => { 17 console.error("Error getting documents: ", error); 18 }) 19 .then(() => { 20 const userRegistration = uids.includes(userData.uid); 21 22 if (!userRegistration) { 23 console.log("新規ユーザー。作る!"); 24 console.log(userData); 25 db.collection("User") 26 .doc(userData.uid) 27 .set(userData) 28 .catch((error) => console.error(error)); 29 } else { 30 console.log("既にユーザーある"); 31 } 32 }); 33}; 34 35export default createUserData;
試したこと
・非同期処理の問題だと思い、aysnc/awaitやthenメソッドなどを使ってみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
javascript
node.js v12
firebase Authentication
上手く行ったコード
signup.js
js
1"use strict"; 2 3import createUserData from "../createUserData.js"; 4import twitterOAuth from "../twitterOAuth.js"; 5import monitorLoginStatus from "../monitorLoginStatus.js"; 6 7const twitterSignup = () => { 8 const signUpButton = document.getElementById("signup"); 9 10 signUpButton.addEventListener("click", () => { 11 twitterOAuth() 12 .then((userData) => { 13 console.log("signup関数の中", userData); 14 return createUserData(userData); 15 }) 16 .then(() => { 17 console.log("monitorの前のログ"); 18 monitorLoginStatus().then((loginStatus) => { 19 if (loginStatus) { 20 // location.replace("../../admin.html"); 21 } 22 }); 23 }); 24 }); 25}; 26 27export default twitterSignup;
createUserData.js
js
1"use strict"; 2 3const db = firebase.firestore(); 4 5const createUserData = (userData) => { 6 const uids = []; 7 8 return db 9 .collection("User") 10 .get() 11 .then((querySnapshot) => { 12 querySnapshot.forEach((doc) => { 13 uids.push(doc.data().uid); 14 }); 15 }) 16 17 .catch((error) => { 18 console.error("Error getting documents: ", error); 19 }) 20 .then(() => { 21 const userRegistration = uids.includes(userData.uid); 22 23 if (!userRegistration) { 24 console.log("新規ユーザー。作る!"); 25 console.log(userData); 26 db.collection("User") 27 .doc(userData.uid) 28 .set(userData) 29 .catch((error) => console.error(error)); 30 } else { 31 console.log("既にユーザーある"); 32 } 33 }); 34}; 35 36export default createUserData;
回答2件
あなたの回答
tips
プレビュー