异步函数递归调用setTimeout无法返回结果及内存问题咨询
问题:智能合约getStatus递归调用无法返回结果及内存疑问
背景
我需要调用智能合约的getStatus函数(等效于API调用),只有当status.fulfilled === true时,才将结果返回给前端。为此我设置每秒调用一次该接口,完成这个过程通常需要5-20秒。
我的实现代码
getStatus函数
async function getStatus(requestId) { try { await Moralis.enableWeb3({ provider: 'metamask' }); const options = { contractAddress: coinFlipAddress, functionName: 'getStatus', abi: coinFlipABI, params: { requestId }, }; var status = await Moralis.executeFunction(options); console.log(status); if (status.fulfilled) { console.log('fulfilled'); return status; } else { setTimeout(async () => { return await getStatus(requestId); }, 1000); } } catch (err) { console.log(err); return { error: err }; } }
调用getStatus的handleFlip函数
const handleFlip = async (choice) => { setCurrentChoice(null); setMetamaskInProgress(true); const transaction = await flip(choice, amount); setMetamaskInProgress(false); setCurrentChoice(choices[choice]); setFlipping(true); setResult('Spinning'); const requestId = waitForConfirmation(transaction); const result = await getStatus(requestId); // 这里是对getStatus的初始调用 console.log('RESULT ' + result); if (result) { setFlipping(false); setSide(result.hasWon ? (choice === '0' ? 'Heads' : 'Tails') : choice === '0' ? 'Tails' : 'Heads'); setResult(result.hasWon ? 'You have won!' : 'You have lost :('); } };
问题现象
函数会递归调用直到status.fulfilled === true,满足条件时console.log('fulfilled')也能正常打印,但结果无法返回到初始调用的handleFlip函数中,console.log('RESULT ' + result)输出的是undefined。
疑问
- 我的代码哪里出问题了?
- 这种递归调用会不会引发内存问题?如果会,有没有其他替代处理方案?
内容的提问来源于stack exchange,提问作者Beng
相关产品推荐
相关产品推荐

