From 317a2a69051727a3df592821e447408501067dac Mon Sep 17 00:00:00 2001 From: Vlad Afonin Date: Sun, 27 Jun 2021 22:41:15 +0300 Subject: [PATCH 1/5] Types fix + removing negation --- src/index.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/index.ts b/src/index.ts index ce26228..32bb77e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,19 +1,16 @@ import {DependencyList, useEffect, useState} from 'react' -export function useAsyncMemo(factory: () => Promise | undefined | null, deps: DependencyList, initial: T = undefined): T { - const [val, setVal] = useState(initial) +export function useAsyncMemo(factory: (...args: any) => Promise, deps?: DependencyList, initial?: T) { + let [val, setVal] = useState(initial) + useEffect(() => { - let cancel = false - const promise = factory() - if (promise === undefined || promise === null) return - promise.then((val) => { - if (!cancel) { - setVal(val) - } - }) + let pending = true + factory().then(res => pending && setVal(res)) + return () => { - cancel = true + pending = false } }, deps) + return val } From b9a1ccd92739973c9b3a8add3cc1980083289492 Mon Sep 17 00:00:00 2001 From: Vlad Afonin Date: Sun, 27 Jun 2021 22:43:12 +0300 Subject: [PATCH 2/5] tabs --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 32bb77e..2cdf183 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ export function useAsyncMemo(factory: (...args: any) => Promise, deps?: De let [val, setVal] = useState(initial) useEffect(() => { - let pending = true + let pending = true factory().then(res => pending && setVal(res)) return () => { From 1734a8c39ebe49bf155d5834e08579efedf96f15 Mon Sep 17 00:00:00 2001 From: Vlad Afonin Date: Tue, 29 Jun 2021 00:21:57 +0300 Subject: [PATCH 3/5] feat: useAsync hook for restoring current value Minimum number of rerenders --- src/index.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 2cdf183..fae561a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import {DependencyList, useEffect, useState} from 'react' +import { DependencyList, useRef, useEffect, useState, useReducer, useMemo } from 'react' export function useAsyncMemo(factory: (...args: any) => Promise, deps?: DependencyList, initial?: T) { let [val, setVal] = useState(initial) @@ -14,3 +14,24 @@ export function useAsyncMemo(factory: (...args: any) => Promise, deps?: De return val } + +export function useAsync(factory: (...args: any) => Promise, deps?: DependencyList, initial?: T) { + let forceUpdate = useReducer(x => !x, false)[1] + let val = useRef(initial) + + useMemo(() => val.current = initial, deps) + useEffect(() => { + let pending = true + factory().then(res => { + if(pending) { + val.current = res + forceUpdate() + } + }) + return () => { + pending = false + } + }, deps) + + return val.current +} From 1aaf227d3f8a7a38cc11fda3ddf8e19dd2307579 Mon Sep 17 00:00:00 2001 From: Vlad Afonin Date: Fri, 2 Jul 2021 11:17:48 +0300 Subject: [PATCH 4/5] chore: factory args --- src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index fae561a..2273848 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ import { DependencyList, useRef, useEffect, useState, useReducer, useMemo } from 'react' -export function useAsyncMemo(factory: (...args: any) => Promise, deps?: DependencyList, initial?: T) { +export function useAsyncMemo(factory: () => Promise, deps?: DependencyList, initial?: T) { let [val, setVal] = useState(initial) useEffect(() => { @@ -15,7 +15,7 @@ export function useAsyncMemo(factory: (...args: any) => Promise, deps?: De return val } -export function useAsync(factory: (...args: any) => Promise, deps?: DependencyList, initial?: T) { +export function useAsync(factory: () => Promise, deps?: DependencyList, initial?: T) { let forceUpdate = useReducer(x => !x, false)[1] let val = useRef(initial) From d520683aab004f469c668bf63c846315e5f7a7d0 Mon Sep 17 00:00:00 2001 From: Vlad Afonin Date: Thu, 8 Jul 2021 22:01:28 +0300 Subject: [PATCH 5/5] fix(useAsync): forceUpdate ignored in some cases --- src/index.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2273848..418243a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,17 +16,15 @@ export function useAsyncMemo(factory: () => Promise, deps?: DependencyList } export function useAsync(factory: () => Promise, deps?: DependencyList, initial?: T) { - let forceUpdate = useReducer(x => !x, false)[1] + let forceUpdate = useState()[1] let val = useRef(initial) useMemo(() => val.current = initial, deps) useEffect(() => { let pending = true factory().then(res => { - if(pending) { - val.current = res - forceUpdate() - } + if(pending) + forceUpdate(val.current = res) }) return () => { pending = false