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

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

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

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

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

React.js

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

Q&A

解決済

2回答

504閲覧

非同期処理 React

nosuke09

総合スコア9

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

非同期処理

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

React.js

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

0グッド

1クリップ

投稿2023/01/08 07:04

前提

React、サーバーサイドにNode.js、データベースにMongodbを使用してTodoアプリを作成しています。

実現したいこと

データベースの内容とは異なり、固定のメッセージを表示する場合は実装できました。データベースの中身を取得して、動的に一覧表示をできるようにしたいのですが非同期処理関連で問題があります。

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

・非同期処理で得たデータをuseStateでセットしても反映されない
・useStateを用いず、適当な変数に収めて値を確認してからpropsとしてデータを渡しListView.jsxからList.jsxを呼び出そうとしているがコンポーネントを非同期にするとエラーが出て動かない

該当のソースコード

・非同期処理で得たデータをuseStateでセットしても反映されない
ListView.jsx

const ListView = async () => { const [tasks, setTasks ] = useState([]); const allTasks = await showTasks(); console.log(allTasks); =>(結果:{allTasks: Array(2)} 取れてる)   setTasks(allTasks); console.log(tasks); =>(結果: [] 取れない) return ( <div className="list_container"> <div className="tasks"> <List tasks={tasks}></List> </div> </div> ); };

・useStateを用いず、適当な変数に収めて値を確認してからpropsとしてデータを渡しListView.jsxからList.jsxを呼び出そうとしているがコンポーネントを非同期にするとエラーが出て動かない(非同期処理をなくして適当な配列を渡したら動く)
エラー内容

react-dom.development.js:14887 Uncaught Error: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead. at throwOnInvalidObjectType (react-dom.development.js:14887:1) at reconcileChildFibers (react-dom.development.js:15828:1) at reconcileChildren (react-dom.development.js:19167:1) at mountIndeterminateComponent (react-dom.development.js:20157:1) at beginWork (react-dom.development.js:21587:1) at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1) at invokeGuardedCallback (react-dom.development.js:4277:1) at beginWork$1 (react-dom.development.js:27451:1) at performUnitOfWork (react-dom.development.js:26557:1)

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

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

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

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

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

guest

回答2

0

自己解決

戻り値をreturnせずに直接useStateのStateにsetする

非同期処理関数をreturnするとPromise型になるので、同一コンポーネント内のuseEffect内に非同期処理関数を定義し
取得した値を関数内で直接setTasks(allTasks);とすることで動作するようになりました。

投稿2023/01/09 06:33

nosuke09

総合スコア9

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

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

0

js

1 console.log(allTasks); =>(結果:{allTasks: Array(2)} 取れてる) 2  setTasks(allTasks); 3 console.log(tasks); =>(結果: [] 取れない)

stateへの反映処理自体が非同期実行ですので、set直後のconsole.log(tasks);では結果が反映されていなくて問題ありません

コンポーネントを非同期にするとエラーが出て動かない

はい、関数コンポーネントにasyncと書いた関数を使うことはできません。コンポーネント直下にawaitを書かず、useEffectなどで処理を行ってください。

投稿2023/01/08 07:27

maisumakun

総合スコア145183

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

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

nosuke09

2023/01/08 11:24

showTasksが非同期処理でgetリクエストをしてデータを取ってきている関数なのですが、これをuseEffect内で処理しろということでしょうか? ``` useEffect(() => { console.log("副作用関数が実行されました。"); setTasks(showTasks()); }) ``` こちらで処理したところ、Listコンポーネントにpropsとして受け取った値を表示してみるとPromise型になっており、値が扱えません。showTasksは非同期で実装しています。
maisumakun

2023/01/08 13:27

showTasks().then(setTasks)のように非同期で得た結果からsetを行ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問