前提・実現したいこと
JavaScriptでasync await内で行ったなんらかの処理(値の取得や判定等)を行った後にその結果をreturn値でtrue/falseまたは0や1などの情報を呼び出しもとのに返却したいのですがそういったことは可能でしょうか?
不可能な場合、何か代替案はあるでしょうか?
下記のソースで行いたいこと
(1)async await内で足し算を行う
(2)(1)の計算結果が10を超えるかどうかの判定を行う
(3)(2)の判定結果を呼び出し元に返却し、その結果により処理を分岐する。
###理想の結果
12 true (valueJudgmentのthen内のコンソールログ) true (test()のcallback関数呼び出し後のコンソールログ) true (onButtonのコンソールログ) Success
###実際の結果
Promise {<pending>} 12 true undefined Failed
該当のソースコード
index.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Asyncテスト</title> <script src="js/index.js"></script> </head> <body> <input type="button" value="ボタン" onclick="onButton()"> </body> </html>
index.js
function onButton(){ test().then(res=>{ console.log(res); // 結果がtrueの場合成功/falseの場合は失敗と表示したい if(res){ console.log("Success"); }else{ console.log("Failed"); } }); } function test(){ // 計算データ let num1 = 5; let num2 = 7; async function callBack(){ let value = 0; await addCalculation(num1,num2).then(res=>{ //(2)計算結果(12)を表示 console.log(res); value = res; }) await valueJudgment(value).then(res=>{ //(3)数値判定結果(true)を表示 console.log(res); // true/falseを返したい return res; }) } // true/falseが帰ってきて欲しい let result = callBack(); // (1)Promise {<pending>}が表示される console.log(result); return result; } async function addCalculation(num1,num2){ // 計算 return num1 + num2; } async function valueJudgment(value){ // 計算結果が10以上か判定 if(10 < value){ return true; }else{ return false; } }
困っていること
元々は同期処理がうまくいってなかったのでasync awaitを利用しようとしているのですがasync awaitだとreturn値がPromiseのオブジェクトが返ってきてしまう・・・(true/falseを返したい)
###補足
上記の簡単な計算を例に挙げていますが実際は下記のことを行いたいです。
(1)画面初期表示にセッション情報を取得、判定を行うメソッドを呼び出す。
(2)セッション情報の判定結果(セッション情報があるかないか)を呼び出し元に返す。
(3)判定結果から画面の初期表示処理を行うかエラーページへ遷移するか分岐する。
※ちなみに、初期表示時にはDBのデータを表に表示する検索処理が行われます。
サンプルコードはhtmとjsを扱っていますが、実際はvueを使用しています。
別のやり口として、初期表示処理をcallback関数として引数で渡して、セッションの判定後のにその関数を実行するなども試してはいますがうまくいかず・・・
(下記のonInit関数を引数のcallback関数として渡しなどを試しているのですがうまくいかず・・・)
methods: { onInit : async function(){ await ・・・ } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/14 12:23