javascript useEffect和事件侦听器

qq24tv8q  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(214)

我需要在contract发出事件后更新数据库。我担心contract在DB操作完成前发出另一个SomeEvent,导致useEffect在第一次更新完成前重新触发。这是真正的问题吗?通常是如何处理的?

useEffect(() => {
        contract.on("SomeEvent", (_a, _b) => {
            ...perform DB operations here!
        })

        /* Handle unmounts */
        return () => {
            contract.removeAllListeners("SomeEvent");
        }
    }, [])
z31licg0

z31licg01#

一种方法是使事件侦听器成为承诺链,这样下一个事件只在前一个事件完成后运行(通过等待异步函数)。

useEffect(() => {
    let queue = Promise.resolve();

    contract.on("SomeEvent", (_a, _b) => {
        queue = queue.then(async () => {
            // perform async DB operations here!
            await dbOperation(_a, _b);
        });
    });

    /* Handle unmounts */
    return () => {
        contract.removeAllListeners("SomeEvent");
    }
}, [])
tpxzln5u

tpxzln5u2#

@塞巴斯蒂安删除了一条建议技术术语“竞态条件”的评论,我发现了这个帮助澄清我的问题是什么的article(同时也阐明了@phil所指出的)。我修修补补,发现1)useEffect将完成所有事件调用,只是不是按照它们被接收的顺序,2)可以使用类似于here的结构检索最新请求

相关问题