Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SetInterval不可预测响应_Javascript_Reactjs_Setinterval - Fatal编程技术网

Javascript SetInterval不可预测响应

Javascript SetInterval不可预测响应,javascript,reactjs,setinterval,Javascript,Reactjs,Setinterval,这已经带走了我所有的精神力量,所以请在这里帮助我 this.pingInterval = window.setInterval( () => { checkMultivac() // an api call }, 20 * 1 * 1000, TIMER.PING_30_MIN, ); 和检查多变量C是否为 export const checkMultivac = async () => { // After successful payment,

这已经带走了我所有的精神力量,所以请在这里帮助我

this.pingInterval = window.setInterval(
   () => {
     checkMultivac() // an api call
  },
  20 * 1 * 1000,
  TIMER.PING_30_MIN,
);
检查多变量C是否为

export const checkMultivac = async () => {
  // After successful payment, vend
  try {
    const url = `${process.env.REACT_APP_API_BASE}/api/checkVMC`;

    const response = await axios({
      url,
      method: 'GET',
      timeout: 1000 * 14,
      headers: {
        Authorization: `Bearer ${localStorage.getItem('token')}`,
        'Content-Type': 'application/json',
      },
    });
    return response.data;
  } catch (err) {
    return {
      error: true,
      data: {},
    };
  }
};
问题是它会进行多个api调用
我通过在chrome中打开网络标签来检查它,20秒后它会发送2-4个api调用。
建议改为使用settimeout,但两种情况下的结果相同。 请帮忙
此外,我将组件中的此函数绑定到我的组件上。

为此使用
setInterval
将导致混乱,因为您的函数是异步的。就计时器子系统所知,回调在异步函数开始工作时就完成了,而不是等待它完成

要等待完成,您需要使用函数返回的承诺,然后在完成后开始下一次ping,如下所示:

const schedulePing = () => {
    this.pingInterval = window.setTimeout( // <== `setTimeout`, not `setInterval`
       () => {
         checkMultivac()
         // Normally you'd need a `.catch(...)` call here to handle/report
         // errors, but you've ensured that `checkMultivac`
         // never rejects its promise, so...
         .finally(schedulePing);
      },
      20 * 1 * 1000      // <== `* 1` has no purpose here
      // TIMER.PING_30_MIN, <== Your code isn't using this
    );
};
schedulePing();
const schedulePing=()=>{
this.pingInterval=window.setTimeout(//{
checkc()
//通常情况下,您需要一个“.catch(…)”呼叫来处理/报告
//错误,但您已确保`
//永远不会拒绝它的承诺,所以。。。
.最后(安排);
},
20 * 1 * 1000      //  {
设置超时(解析、毫秒、参数);
});
}
异步函数checkc(){
日志(“检查多变量启动”);
等待延迟(Math.random()*3000);
日志(“检查结束”);
}
函数日志(…msgs){
log(新日期().toISOString().substring(11),…msgs);
}

obj.method()
您提供给
setInterval
的第三个参数的目的是什么
setInterval
将其传递给回调函数,但是你的回调没有使用它…你的问题是,你希望每20秒看到一个调用,而你的代码发出的调用比这个还要多?@t.J.Crowder我用它在以后卸载它时清除它component@Charlie问题是,每隔20秒,它就会发出2次以上的api调用,这是它在20秒后多次发出的回调您在“网络”选项卡上添加了一个图像,并突出显示了这2-4个通话?谢谢。正在检查并将立即响应,但它不起作用。我还尝试将
window.pingInterval=…
设置为init多次。但同样results@RajanLagah-上面的第一个版本工作正常,请参见实时示例。第二个有一个小错误(我确实说过它是即兴的,需要检查),我已经在上面修复了这个错误,请参见现场示例。