0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[備忘録]APIのレスポンスなどの非同期処理が早過ぎる場合でも、ローディングを1秒間は表示する方法

Last updated at Posted at 2021-04-10

APIレスポンスが早すぎてローディングが一瞬しか出ない問題

APIのレスポンスに限らず、Promiseの処理が一瞬で終わってしまい、ローディングがほとんど表示されないため、正常に処理が終了したのかわかりにくい場合があると思う。
その際に、いい感じに書く方法をメモっておく。

ReactNativeのRefreshControlの例

重要なのは、const promise = refreshFunc()setTimeoutの部分。
ここで、refreshFunc()は非同期処理である。
非同期処理のPromiseオブジェクトを変数に入れておくことで、非同期処理の実行は先に行うが、
どんなに早く非同期処理が終了しても、setTimeoutの時間が経過した後でしか結果をチェックしないようにする。

export const ScrollViewWithRefresh = ({refreshFunc, children, ...props}) => {
  const [isRefreshing, setIsRefreshing] = useState(false)

  return (
    <ScrollView
      refreshControl={
        <RefreshControl
          refreshing={isRefreshing}
          colors={[primary]}
          tintColor={primary}
          onRefresh={async () => {
            setIsRefreshing(true)
            const promise = refreshFunc()
            setTimeout(() => {
              promise.then(() => setIsRefreshing(false))
            }, 1000) // 最短でも1秒間はローディングを表示する
          }}
        />
      }
      {...props}
    >
      {children}
    </ScrollView>
  )
}

ググる力がなさすぎて、いい方法が見つからなかったので、どうにか自分で書いてみた。
もっといい方法があれば教えて下さい。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?