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

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

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

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

2回答

256閲覧

react TypeScript 関数Aの結果をもとに関数Bを実行する方法

asdkfj

総合スコア0

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2024/10/04 06:54

編集2024/10/04 07:06

実現したいこと

①検索処理Aを実行しリストAを取得
②リストAを引数に検索処理Bを実行しリストBを取得
ということをしたいです。

発生している問題・分からないこと

②の時点でリストAが空になっているため以降の処理が上手くいきません。
リストAを取得してから検索処理Bを実行するにはどうすればよいでしょうか?

該当のソースコード

import { useSearchA } from "./hooks/useSearchA"; import { useSearchB } from "./hooks/useSearchB"; export const Main = (): JSX.Element => { const { listA, searchA } = useSearchA(); const { listB, searchB } = useSearchB(); const onSearchA = () => { searchA().then; }; const onSearchB = () => { searchB(listA).then; // listAが空 }; return ( <> <button onClick={() => { onSearchA(); onSearchB(); }} /> </> ); };
type UseSearchAType = { listA: []; searchA: () => Promise<void>; }; export const useSearchA = (): UseSearchAType => { const [ listA, setListA ] = useState<[]>([]); const search = useCallback( async () => { const result = バックエンドAPIを実行 setListA(result); }, [] ); return { listA, search, }; };
type UseSearchBType = { listB: []; searchB: (conditionB: []| undefined) => Promise<void>; }; export const useSearchB = (): UseSearchBType => { const [ listB, setListB ] = useState<[]>([]); const search = useCallback( async (conditionB | undefined) => { const result = バックエンドAPIを実行 setListB(result); }, [] ); return { listB, search, }; };

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

メイン処理の

TypeScript

1const onSearchB = () => { 2 searchB(listA).then(); // listAが空 3};

TypeScript

1useEffect(() => { 2 searchB(listA).then(); 3}, [listA]);

と変えたりしましたが上手くいきませんでした。

補足

特になし

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

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

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

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

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

maisumakun

2024/10/04 07:02

.then;となっていますが、この部分は何を意図したものでしょうか? (thenメソッドを参照するだけでは、期待される動作はありません)
asdkfj

2024/10/04 07:08

すみません、then;ではなくthen();にしているため修正しました。 searchA,searchBがPromiseのため必要かと思いつけていましたがこれも特に意味ないのでしょうか。。
maisumakun

2024/10/04 07:15 編集

> then;ではなくthen();にしているため修正しました。 searchA,searchBがPromiseのため必要かと思いつけていましたがこれも特に意味ないのでしょうか。。 はい。thenは引数として渡した関数をPromise解決時に実行するメソッドなので、then(空カッコ);でも無意味です。
asdkfj

2024/10/04 07:19

ありがとうございます。
maisumakun

2024/10/04 08:13

useEffectでlistAを拾う形にした場合、どのような挙動を示したのですか? (「動かない」だけではなく、コンソールにエラーが出ていないかなど詳細も確認してください)
guest

回答2

0

細かなところは分かりませんが、すくなくとも、 State as Snapshot(状態のスナップショット) に引っかかっているかと思われます。

こちらの記事で解説しています。

https://qiita.com/honey32/items/ee8d1577e68b0d58678d

極めて簡易的な例ですが、以下のように、「seatchA 関数が、返り値として取得結果を返すようにして、それを searchB の引数に渡す」といった形で実装するのが、解決方法の一つになります。

tsx

1<button 2 onClick={() => { 3 searchA().then((data) => searchB(data)) 4 }} 5/>

投稿2024/10/05 11:59

honey32

総合スコア230

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

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

0

誤回答です

そもそも、待つべき部分はuseSearchA()useSearchB()

const { listA, searchA } = await useSearchA(); const { listB, searchB } = await useSearchB();

投稿2024/10/04 07:47

編集2024/10/04 08:15
FoxRefire

総合スコア146

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

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

maisumakun

2024/10/04 07:51

useSearchA()やuseSearchB()はふつうの値を返すので、そこにawaitを書いても無意味です。 ……というより、関数コンポーネント全体をasyncにはできない以上、そこにawaitを書くようなパターンは発生しません。
FoxRefire

2024/10/04 08:02

質問者提示のソースコードの2つ目及び3つ目を見ると、非同期関数でこれがuseSearchA、Bのコードだと認識ですが違うのですか? 普段Javascriptのみ書いててTypescriptは書かないので... こういう話ではないということですか? ``` async function hoge(){ return {foo:1, bar:2}; } let {foo} = await hoge() console.log(foo) //1 let {bar} = hoge() console.log(bar) //undefined ```
maisumakun

2024/10/04 08:12

> 質問者提示のソースコードの2つ目及び3つ目を見ると、非同期関数でこれがuseSearchA、Bのコードだと認識ですが違うのですか? 非同期関数だと認識できません。useSearchAやuseSearchB自体に、asyncは付与されていませんし、Promiseも返しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問