You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

异步函数递归调用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。

疑问

  1. 我的代码哪里出问题了?
  2. 这种递归调用会不会引发内存问题?如果会,有没有其他替代处理方案?

内容的提问来源于stack exchange,提问作者Beng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:22