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

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

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

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

478閲覧

returnするものが無い関数の終了を待ってから、次の処理を実行したい。

erajera

総合スコア22

JavaScript

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/05/06 23:37

Reactを使用しています。

前提・実現したいこと

javascript

1const [img, setImg] = useState("") 2const compressionImage = () => { 3 CompImg.set( 4 hoge, 5 fuga, 6 (uri) => { 7 const imgURL = uploadStorage(uri) 8 setImg(imgURL) 9 } 10 ) 11} 12 13const updateData = async () => { 14 await compressionImage(); 15 const newData = { 16 img: img, 17 name: "hoge" 18 } 19 console.log(newData) 20}

上記のコード場合において、newDataオブジェクトのimgプロパティの値を、compressionImagesetStateした値を代入したいです。

最初の関数compressionImageではreturnするものが無いため、awaitが意味をなしていない状況です。
また、compressionImageCompImgは、画像を圧縮するライブラリです。

発生している問題・エラーメッセージ

最初の関数compressionImageの実行終了を待たないので、newDataimg""になります。

試したこと

「javascript return 無し async await」とか、今回とは関係ないですが初心者がよく壁にぶつかりそうな「javascript for 終了後」とかでググったのですが、解決策になりそうなコードを見つけられませんでした。

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

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

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

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

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

guest

回答2

0

自己解決

コードを根本から変える可能性があるため、この質問はしめます。

投稿2021/05/07 00:55

erajera

総合スコア22

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

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

0

imgの変化をuseEffectで監視する、という流れではだめなのでしょうか。

javascript

1const updateData = () => { 2 compressionImage(); 3} 4 5useEffect(() => { 6 if(!img) return; 7 const newData = { 8 img: img, 9 name: "hoge" 10 } 11 console.log(newData) 12}, [img]);

投稿2021/05/07 00:11

編集2021/05/07 00:12
maisumakun

総合スコア146018

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

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

maisumakun

2021/05/07 00:14

stateは、値が変わるごとに別な変数となりますが、クロージャを作ると「その時点の値」をキャプチャしてしまうので、stateの変化に追随できなくなります。 (refを使って回避する方法はありえます)
erajera

2021/05/07 00:27

回答ありがとうございます。それならできそうですね。ただ、できればuseEffectに切り出さずupdateDate関数にまとめて簡潔にしておきたいです。ライブラリの引数の関数内でsetStateしているために簡潔に書くのが困難になるのでしょうか。それであれば、ライブラリの選定も検討します。 個人的な話で恐縮ですが、async/awaitから非同期処理に入った身としては、Promise関連のメソッドはよく分かっておらず、分かっていないゆえに「Promise関連のメソッドや書き方でもしかしたら解決できるのかな」と考え、回答を通じて学習しようと思っていました。
maisumakun

2021/05/07 00:37

> ただ、できればuseEffectに切り出さずupdateDate関数にまとめて簡潔にしておきたいです。 「値がstateとして与えられる」という状況下では、普通にクロージャを作ってしまうとstateの変化に追随できないので簡潔になりません(関数自体をrefの値にするなどの複雑な仕掛けが必要となります)。
maisumakun

2021/05/07 00:39

> 個人的な話で恐縮ですが(後略) 今回の場合は「非同期処理」と「React特有の処理」が絡んだ問題、といったところです。
erajera

2021/05/07 00:54

最初のコメントの意味が理解できました。imgの値をstateで管理せず取得するよう試みます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問