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

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

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

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

Q&A

解決済

2回答

1706閲覧

async/awaitで取得した値を使いたい

tsu56569

総合スコア17

JavaScript

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

0グッド

0クリップ

投稿2021/03/02 06:31

javascript

1window.AudioContext = window.AudioContext || window.webkitAudioContext; 2const ctx = new AudioContext(); 3 4export async function setupSample(key_list) { 5 let return_list = [] 6 for (let i = 0; i < key_list.length; i++) { 7 const target = document.querySelector(`audio[data-key="${key_list[i]}"]`).getAttribute('src') 8 const response = await fetch(target); 9 const arrayBuffer = await response.arrayBuffer(); 10 // Web Audio APIで使える形式に変換 11 return_list.push(await ctx.decodeAudioData(arrayBuffer)) 12 } 13 return return_list; 14} 15let list = ["c4","c5"] 16let a = setupSample(list) 17console.log(a) 18

ピアノの鍵盤の音をページ読み込み時にWeb Audio APIで使える形式に変換した物をリスト入れて返したいのですが、返ってくる値がPromise {<pending>}となってしまいどうやって取り出していいかわかりません…

どうすれば普通のリストとして返ってくるでしょうか?

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

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

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

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

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

int32_t

2021/03/02 06:49

return_list の要素が push 時に await しているのに Promiseになってしまう、という状況で合ってますか?
tsu56569

2021/03/02 07:03

すみませんそんなに詳しくないのでわからないのですが、関数内でのreturn_listの最終結果を見てみると、[AudioBuffer, AudioBuffer]と、想定通りリストになっているのですが、実行して返ってくる値が入る変数aがPromiseになっているという事なのですが、説明あってるでしょうか?
int32_t

2021/03/02 07:05

ああなるほど、a の問題ですね。回答書きます。
guest

回答2

0

javascript

1let a = setupSample(list); 2console.log(a);

setupSample()async 関数ですから、その結果を得るためには Promise の解決をするか await で待つ必要があります。await で待つ場合は、待つコードも async 関数の中である必要があるので、以下のようにします。

javascript

1async function foo() { 2 let list = ["c4","c5"] 3 let a = await setupSample(list) 4 console.log(a) 5} 6foo();

投稿2021/03/02 07:08

int32_t

総合スコア20916

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

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

tsu56569

2021/03/02 07:20

回答ありがとうございます、多分私の質問が良くなかったかと思います。 aはこの関数内だけではなく、別の関数で使いたくて、そのためにリストの形で取得したいのですが、そういった方法はあるのでしょうか?
int32_t

2021/03/02 07:49

aがローカル変数である必要はありません。グローバルにしてもよいし、別の関数に渡してもよいです。
guest

0

ベストアンサー

返ってくる値がPromise {<pending>}となってしまいどうやって取り出していいかわかりません…

ブラウザJavaScriptで一度非同期操作に入った場合、その値を同期的に得る方法はありません

得たPromiseからさらにthenをつなぐ、awaitで受ける、などをして中身を使うほかありません。

投稿2021/03/02 06:46

maisumakun

総合スコア145192

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

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

tsu56569

2021/03/02 08:53

無いんですね…ということは、ページ読み込み時に一気に変換して、変換と再生を分けたかったんですが、難しそうですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問