【发布时间】:2020-12-10 09:46:47
【问题描述】:
在我的反应函数组件中,我发送多个服务器请求并通过异步承诺更新状态挂钩值,方法是将服务器结果附加到状态最新值,但是一旦创建承诺,状态挂钩的值不会在运行承诺中更新,因此,如果另一个 Promise 更新了 state 值,其他正在运行的 Promise 不会得到通知,因此它们会使用旧版本的 state 进行进一步的状态更新。
下面的代码是我的组件的简化版本,我希望在每个 promise 的第 19 行控制台日志中看到相同的(并且是最新的)值,同时多个 promise 正在运行并且状态得到更新。
function App() {
const [myArray, setMyArray] = useState([0,1,2])
const sleep = (ms:number) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
const updateArray = () => {
setMyArray([...myArray, myArray.length])
}
const firePromise = () => {
new Promise(async (resolve) => {
const timeStamp = new Date().getTime()
let repeatTime = 0
while(repeatTime < 12){
console.log("array: ", myArray, "promiseIdenifier: ", timeStamp);
repeatTime += 1
await sleep(1000)
}
resolve({timeStamp, myArray})
}).then(val => {
console.log("resolved: ", val);
}).catch(err => {
console.log("rejected: ", err);
})
}
return (
<div className="App">
<button onClick={firePromise}>new promise</button>
<button onClick={updateArray}>updateArray</button>
</div>
);
}
export default App;
【问题讨论】:
-
在这种情况下,你最好使用 refs 而不是 state,试试
useRef -
很棒的提示,你绝对救了我一整天的兄弟 =) @Konstantin
标签: javascript reactjs promise