実現したいこと
①検索処理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]);
と変えたりしましたが上手くいきませんでした。
補足
特になし
.then;となっていますが、この部分は何を意図したものでしょうか?
(thenメソッドを参照するだけでは、期待される動作はありません)
すみません、then;ではなくthen();にしているため修正しました。
searchA,searchBがPromiseのため必要かと思いつけていましたがこれも特に意味ないのでしょうか。。
> then;ではなくthen();にしているため修正しました。
searchA,searchBがPromiseのため必要かと思いつけていましたがこれも特に意味ないのでしょうか。。
はい。thenは引数として渡した関数をPromise解決時に実行するメソッドなので、then(空カッコ);でも無意味です。
ありがとうございます。
useEffectでlistAを拾う形にした場合、どのような挙動を示したのですか?
(「動かない」だけではなく、コンソールにエラーが出ていないかなど詳細も確認してください)