質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

3回答

610閲覧

非同期処理をコントールする方法(await/async)

ra-mentukemen

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/04/26 12:33

編集2022/04/26 14:27

javascriptの初心者なのですが以下のことをどう実装すればよいか、可能なのか教えてください。
localstorageにトークンを保存している状態なのですが、このトークンをとってきて、ヘッダーに付与にAPIに投げたいです。

javascript

1function fetchData(){ 2 3//①トークンを取得しにいく処理// 4 5//②取得したトークンをヘッダーに付与し、APIへのリクエストを作成する処理// 6 7}

簡単にこのような関数があり、トークンをとり、リクエストを作成します、
そしてこの関数はAPIへのリクエストを戻り値とします。
このとき、②で作成されるリクエストのヘッダーの中にトークンが埋め込まれているのが理想なのですが、
②の直下でログを出してみると、埋め込まれていません。
ただ、トークンを格納している変数を見てみると、しっかりとトークンが入っていました。
ログをみていると、①の処理が終わる前に②の処理が終了しているようでした。
そのため、①でトークンを取得する前に②でリクエストを作っていることから、理想とするリクエストができていませんでした。
ここでなのですが、どのようにして①の処理が終わったあとに②の処理を走らせることができるのでしょうか。
非同期関数についてしらべたのですが、どれも関数に対してasyncを使っていました。
①の処理や②の処理を関数化する必要があるのでしょうか。
どのあたりにawait やasyncをつけ、どの部分を関数化させるべきなのか意見ください。

以下により具体的な処理を記載します。(諸事情により全部は載せられなくて、すみません)

function fetchData(){ //①トークンを取得しにいく処理 const tokenRequest ={ scope:["http://XXXXX"] account:account } msalInstance.acquireTokenSilent(tokenRequest) .then((res) => { let accesstoken = res.accessToken //ここでトークンを取得しています。 } //②取得したトークンをヘッダーに付与し、APIへのリクエストを作成する処理 const headers = new Header(); const bearer = 'Bearer ${accsesstoken}'; headers.append("Authorization", bearer) const options = { method:"POST", header: headers }; //以下bodyの作成// }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2022/04/26 12:45

質問文のコードがほぼ空で、助言できません。もっと具体的なコードを開示してください。
退会済みユーザー

退会済みユーザー

2022/04/27 02:04

質問者さん、その後無言ですが、当方が提案した Fiddler などのキャプチャツール (ブラウザのディベロッパーツールでもできるはず) を使って調べることをやってみましたか? キャプチャ結果を見ないことには、闇夜に鉄砲、暗中模索という感じで、問題を見つけるのが難しく、なかなか進展しないと思うのですが・・・ > 今使っているのとは別の方法でlocalstorageのトークンを取りに行き、同じようにAPIにリクエストした際は上手くデータが取得できてたので、ヘッダーの作成等は問題ないかと思います。 特にうまくいくケース/いかないケースがあるなら、Fiddler で両方の要求・応答を調べて、その違いを見るとそこにヒントが見つかると思います。
guest

回答3

0

アクセストークンを受け取ってから続けて処理を行いたいのであれば、まずはシンプルに .then の中で一緒に記載しましょう。

js

1function fetchData(){ 2 //①トークンを取得しにいく処理 3 const tokenRequest ={ 4 scope: ["http://XXXXX"], 5 account: account 6 }; 7 8 msalInstance.acquireTokenSilent(tokenRequest) 9 .then((res) => { 10 let accesstoken = res.accessToken; //ここでトークンを取得しています。 11 12 //②取得したトークンをヘッダーに付与し、APIへのリクエストを作成する処理 13 const headers = new Header(); 14 const bearer = 'Bearer ${accsesstoken}'; 15 16 headers.append("Authorization", bearer); 17 18 const options = { 19 method:"POST", 20 header: headers 21 }; 22 //以下bodyの作成// 23 } 24}

投稿2022/04/26 15:41

mather

総合スコア6753

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

js

1(res) => { 2 let accesstoken = res.accessToken //ここでトークンを取得しています。 3}

現状のコードだと、この部分のコードは関数 fetchData() が終了した後に呼ばれます。

ご察しの通り、この場合は async/await を使うことで希望の動作が得られます。

  • function fetchData() の前に async を追加
  • acquireTokenSilent(tokenRequest) の部分を let accesstoken = (await msalInstance.acquireTokenSilent(tokenRequest)).accessToken; に。
  • fetchData() の呼び出しコードも、await fetchData() にしたりasync function にするなど変更が必要です。

投稿2022/04/26 14:41

int32_t

総合スコア20880

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-mentukemen

2022/04/26 15:08

僕の書いたコードが省略しつつで悪かったかもしれませんが、 一応fetchData()の中でaccesstoken = res.accessTokenを処理していますが、 それでも最後に実行されるのでしょうか。
int32_t

2022/04/26 23:06

「accesstoken = res.accessToken」は fetchData() のコードではありません。then() に渡しているアロー関数のコードです。
guest

0

②の直下でログを出してみると、埋め込まれていません。

ログではなくて、Fiddler などのキャプチャツールを使って要求ヘッダが期待通りになっているか調べましょう。

ベアラトークンであれば、期待通り送信されていれば要求ヘッダに Authorization: Bearer xxxxxx という形(xxxxxx がトークン)で含まれて送信されていると思います。下の画像で赤枠で囲った部分がその例です。

イメージ説明

送信ヘッダを表示したウィンドウの下は返ってきた JSON 文字列です。このように応答も期待通りか調べることができます。

どのあたりにawait やasyncをつけ、どの部分を関数化させるべきなのか意見ください。

上の画像の要求を送信した JSX のコード例は以下のようになっています。質問者さんのケースとは違うでしょうからあくまで参考ということで。

イメージ説明


【追記】

Fetch の使い方、async / await の付与の仕方については以下のドキュメントも参考になるかと思います。

Fetch の使用
https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch

それに書いてありますが fetch 本体および、JSON の本文の内容を抽出する json() は Promise を返すので、上の私の回答の画像では await を付与しています。

上の私の回答の画像ではトークンを取得するメソッドも Promise を返すので await を付与していますが、質問者さんのケースでは不要かもしれません。

投稿2022/04/26 13:55

編集2022/04/26 14:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ra-mentukemen

2022/04/26 14:29

色々とありがとうございます。 今使っているのとは別の方法でlocalstorageのトークンを取りに行き、同じようにAPIにリクエストした際は上手くデータが取得できてたので、ヘッダーの作成等は問題ないかと思います。 私自身が非同期処理に関して理解できておらず、そこが問題なのかなと、、
退会済みユーザー

退会済みユーザー

2022/04/26 14:45

上に書いたようにまずはキャプチャツールを使って調べることをお勧めします。
退会済みユーザー

退会済みユーザー

2022/04/27 02:04

質問者さん、その後無言ですが、当方が提案した Fiddler などのキャプチャツール (ブラウザのディベロッパーツールでもできるはず) を使って調べることをやってみましたか? キャプチャ結果を見ないことには、闇夜に鉄砲、暗中模索という感じで、問題を見つけるのが難しく、なかなか進展しないと思うのですが・・・ > 今使っているのとは別の方法でlocalstorageのトークンを取りに行き、同じようにAPIにリクエストした際は上手くデータが取得できてたので、ヘッダーの作成等は問題ないかと思います。 特にうまくいくケース/いかないケースがあるなら、Fiddler で両方の要求・応答を調べて、その違いを見るとそこにヒントが見つかると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問