如何从承诺中更新状态变量?

How can I update a state variable from a promise?

我正在尝试确定客户是否有有效订阅。为此,我使用了以下代码:

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

)

}


我已经能够成功地获得所有其他功能,我正在比较用户是否是订阅者,但我遇到的问题是更新状态值(例如,如果他们被替代,则为真,否则为假)。

我发现了一些关于这个特定主题的过去的好问题,例如: 这里

此处:

这里:

但我就是没能让它正常工作。这是目前我最接近解决这个问题的方法。

目前您的代码说,当 isSubscriber 发生变化时,它应该检查用户是否是订阅者并更新 isSubscriber 状态...所以这是先有鸡还是先有蛋的问题。在设置 isSubscriber 之前,它不会设置 isSubscriber

我认为您想将 }, [isSubscriber]); 更改为 }, []);,以便该代码在组件首次加载时执行(而不是在 isSubscriber 更改时执行)。

useEffect 挂钩 将始终 运行 挂载 不管 其依赖项数组中是否有任何内容。这意味着您的 useEffect 将按原样工作,并将 运行 onMount 以及 isSubscriber 更改时:

    useEffect( () => {
        async function load_result() {
            const promise_function_return = await test_equality()
            setIsSubscriber(promise_function_return)
        }
        load_result();
}, [isSubscriber]);

要验证这一点,您可以查看 this codesandbox example。 useEffect 看起来和你的一样,你会注意到 isSubscriber 最初设置为 false,但在 3 秒后更新为 true

即使该部分看起来工作正常,您可能仍需要进行调整。在依赖项数组中使用 isSubscriber useEffect 中的函数将在任何时候 isSubscriber 更改 时被调用。这可能不是您想要的,因为此函数实际上并不依赖于 isSubscriber,而是实际上设置了 isSubscriber。在这种情况下,这意味着 test_equality() 将在初始装载时变为 运行,然后在设置 isSubscriber 后再次变为

,这是不必要的。

This blog post 很好地解释了 useEffect 依赖项数组。

您可以通过 从依赖项数组中删除 isSubscriber 来解决此问题,如下所示:

  useEffect(() => {
    console.log("in useEffect");
    async function load_result() {
      const promise_function_return = await test_equality();
      setIsSubscriber(promise_function_return);
    }
    load_result();
  }, [isSubscriber]);

既然您提到状态值没有得到更新,那么 get_customer_id()customer_is_subscriber() 中肯定存在另一个问题。最好仔细检查并确保条带 api 调用按预期工作。