javascript - 使用钩子在 React 组件的多次调用之间共享可变状态
问题描述
我想创建一个withPromise
,它的工作原理是这样的:
import {useState, withEffect} from "react";
function usePromise(promise, default=null) {
// This state variable will hold the value of our promise.
// We allow the user to pass in a default value that'l be returned
// as long as the promise hasn't been resolved.
let value, setValue = useState(default);
// Ensure that this is only re-run when the promise changes.
withEffect(() => {
promise.then(setValue)
}, [promise])
return value;
}
如果promise 参数从不改变,这很有效,但我希望它能够适应传入新的promise,因为在这一点上,它可能会导致竞争条件。
promise1
被传递给usePromise
promise2
被传递给usePromis-e
promise2
已解决,将值设置为value2
promise1
已解决,将值设置为value1
在这一系列事件中,新 Promise 的值被旧 Promise 的值覆盖,旧 Promise 的值稍后解决。
但是由于承诺是不可取消的,我看不到一种方法来检查承诺的回调是否在等待解决时是否已传入新的承诺。
有什么办法可以做到这一点吗?
解决方案
useEffect 可以返回一个用于拆卸逻辑的函数。虽然您无法取消承诺,但您可以设置一个标志,然后检查该承诺何时解决以中止回调。例如,如下所示:
function usePromise(promise, default=null) {
let [value, setValue] = useState(default);
useEffect(() => {
let cancelled = false;
promise.then((result) => {
if (!cancelled) {
setValue(result);
}
})
return () => cancelled = true;
}, [promise])
return value;
}
推荐阅读
- vbscript - VBScript:从网页下载 JSON 文件并将内容读取到变量
- ios - 如何从 AVAudioBuffer 音频样本中确定音量
- next.js - NextJs - Apollo - 第一次渲染不是 SSR
- sql - 没有 CREATE TABLE 的连接列上的 SQL JOIN
- sqlite - 当从文字中的相同总数中减去总和时,SQLite 会显示浮点数
- python - 在熊猫数据框中组合多行
- reactjs - 收到警告:列表中的每个孩子都应该有一个唯一的“关键”道具。在传播 props 和组合多个 Mui 组件时
- spring-integration - WARN JdbcChannelMessageStore 带有 id 的消息没有被删除
- python - cv2.imshow([winname], [mat]) 后的分段错误
- angular - AngularFirestore 动态查询