Estoy tratando de determinar si un cliente tiene una suscripción activa o no. Para hacer esto estoy utilizando el siguiente código:
const stripe = require('stripe')('some-api-key'); export default function Example(){ // the user will automatically be considered non-subbed by default const [isSubscriber, setIsSubscriber] = useState(false) // grab the customer id from stripe async function get_customer_id() { const customers = await stripe.customers.search({ query: `metadata[\'some-meta-data-key\']:\'some-meta-data-value\'` }); return customers.data[0]['id'] } // grab the list of active subscriptions from stripe async function customer_is_subscriber(){ const subs = await stripe.subscriptions.list({ status: 'active', }); return subs } // determine if the customer id is in the list of active subscriptions. // return true if so, false otherwise async function test_equality(){ const customer_id = await get_customer_id(); const subbed = await customer_is_subscriber(); const answer = subbed.find(sub => sub.customer === customer_id) return !!answer; } useEffect( () => { async function load_result() { const promise_function_return = await test_equality() setIsSubscriber(promise_function_return) } load_result(); }, [isSubscriber]); return ( // some react code ) }Pude obtener con éxito todas mis otras funciones donde estoy haciendo las comparaciones para si un usuario es un suscriptor pero donde tengo un problema es actualizar el valor del estado (por ejemplo, verdadero si están subtitulados, falso de lo contrario).
Encontré algunas buenas preguntas pasadas sobre este tema específico, como: aquí El método useState set no refleja un cambio inmediatamente
aquí: setState dentro de Promise en React
y aquí: setState dentro de una función Promise en un useEffect con ganchos?
pero no he sido capaz de hacerlo funcionar correctamente. Esto es actualmente lo más cerca que he podido llegar a resolver este problema.
Actualmente, su código dice que, cuando cambia isSubscriber , debe verificar si el usuario es un suscriptor y actualizar el estado de isSubscriber ... por lo que es un problema del huevo y la gallina. No establecerá isSubscriber hasta que se establezca isSubscriber .
Creo que quieres cambiar }, [isSubscriber]); a }, []); para que ese código se ejecute cuando el componente se carga por primera vez (no cuando cambia isSubscriber ).
El enlace useEffect siempre se ejecutará en el montaje, independientemente de si hay algo en su matriz de dependencia. Esto significa que su useEffect funcionará tal cual, y se ejecutará onMount así como cuando cambie isSubscriber :
useEffect( () => { async function load_result() { const promise_function_return = await test_equality() setIsSubscriber(promise_function_return) } load_result(); }, [isSubscriber]); Para verificar esto, puede consultar este ejemplo de codesandbox . El useEffect se parece al suyo, y notará que isSubscriber inicialmente se establece en false , pero se actualiza a true después de 3 segundos.
Todavía hay un ajuste que puede querer hacer aunque esa parte parece funcionar bien. Con isSubscriber en la matriz de dependencia, se llamará a la función en su useEffect cada vez que cambie isSubscriber . Probablemente esto no sea lo que desea, ya que esta función en realidad no depende de isSubscriber , pero en realidad establece isSubscriber . En este caso, eso significa que test_equality() se ejecutará en el montaje inicial y luego una vez más después de establecer isSubscriber , lo cual es innecesario.
Esta publicación de blog explica muy bien la matriz de dependencias useEffect.
Puede solucionar esto eliminando isSubscriber de la matriz de dependencias, así:
useEffect(() => { console.log("in useEffect"); async function load_result() { const promise_function_return = await test_equality(); setIsSubscriber(promise_function_return); } load_result(); }, [isSubscriber]); Como mencionó que el valor del estado no se actualiza, debe haber otro problema en get_customer_id() o customer_is_subscriber() . Sería bueno verificar dos veces y asegurarse de que las llamadas a la API de stripe funcionen como se espera.