Reactjs 在异步回调中使用useState钩子

Reactjs 在异步回调中使用useState钩子,reactjs,react-hooks,Reactjs,React Hooks,我正在运行一个带有回调的异步操作(在本例中是ipfs,但这可能无关紧要),我正在尝试使用回调中的挂钩设置状态。但是代码没有运行…我需要在这里使用useEffect吗 await ipfs.add(buffer, (err, ipfsHash) => { setIpfsHash(ipfsHash); console.log("in ipfs - ipfshash", ipfsHash); }); setIpfsHash正在阻止内部代码。console.log不能以处

我正在运行一个带有回调的异步操作(在本例中是ipfs,但这可能无关紧要),我正在尝试使用回调中的挂钩设置状态。但是代码没有运行…我需要在这里使用useEffect吗

await ipfs.add(buffer, (err, ipfsHash) => {
      setIpfsHash(ipfsHash);
      console.log("in ipfs - ipfshash", ipfsHash);
});

setIpfsHash正在阻止内部代码。console.log不能以处理
IPF的方式运行。使用
async/await
添加
函数不正确。但是,是的,在这种情况下,您需要使用
React.useffect

如果要使用
async/await
,则需要创建一个新的承诺。在您的示例中,
ifps.add(buffer,callback)
看起来它将回调作为参数,所以这不起作用

相反,把它变成承诺:

函数添加(缓冲区){
返回新承诺((解决、拒绝)=>{
常量ipfs=。。。
添加(缓冲区,(错误,ipfsHash)=>{
如果(错误){
拒绝(错误)
返回
}
解析(ipfsHash)
})
})
}
然后,您可以在
React.useffect
中使用
async/await
,如下例所示:

函数应用程序(){
常量[buffer,setBuffer]=React.useState(null)
const[ipfsHash,setIpfsHash]=React.useState(null)
React.useffect(()=>{
异步函数doWork(){
试一试{
常量结果=等待添加(缓冲区)
setIpfsHash(结果)
}捕获(错误){
//处理错误
}
}
嫁妆
},[buffer])
返回(
...
)
}
确保为
useffect
钩子指定依赖项数组,以便它仅在需要时运行:

React.useffect(()=>{
// ...
},[buffer])

处理
IPF的方式。使用
async/await
添加
函数是不正确的。但是,是的,在这种情况下,您需要使用
React.useffect

如果要使用
async/await
,则需要创建一个新的承诺。在您的示例中,
ifps.add(buffer,callback)
看起来它将回调作为参数,所以这不起作用

相反,把它变成承诺:

函数添加(缓冲区){
返回新承诺((解决、拒绝)=>{
常量ipfs=。。。
添加(缓冲区,(错误,ipfsHash)=>{
如果(错误){
拒绝(错误)
返回
}
解析(ipfsHash)
})
})
}
然后,您可以在
React.useffect
中使用
async/await
,如下例所示:

函数应用程序(){
常量[buffer,setBuffer]=React.useState(null)
const[ipfsHash,setIpfsHash]=React.useState(null)
React.useffect(()=>{
异步函数doWork(){
试一试{
常量结果=等待添加(缓冲区)
setIpfsHash(结果)
}捕获(错误){
//处理错误
}
}
嫁妆
},[buffer])
返回(
...
)
}
确保为
useffect
钩子指定依赖项数组,以便它仅在需要时运行:

React.useffect(()=>{
// ...
},[buffer])

你能在codesanbox.io上创建一个最小的复制示例吗?我看不出上述代码有任何问题。什么不起作用?ipfs很酷。你还有问题吗?你能在codesanbox.io上创建一个最小的复制示例吗?我看不出上面的代码有任何问题什么不起作用?ipfs的酷东西。你还有问题吗?