定期解析javascript中的承诺

定期解析javascript中的承诺,javascript,promise,setinterval,Javascript,Promise,Setinterval,假设我想在函数运行后每隔2秒解决一些承诺 我一开始尝试了这样一种模式:setInterval(MyAsyncFunction,2000),但当然这不会等到承诺解决后再再次调用该函数 我还尝试了setInterval(async()=>await myasync function(),2000),但这基本上是一样的,因为我只是将它包装在另一个承诺中,在setInterval开始计时时解决它 是否有一种方法可以完成我试图使用setInterval所做的事情,或者是否有其他方法可以使用setTimeo

假设我想在函数运行后每隔2秒解决一些承诺

我一开始尝试了这样一种模式:
setInterval(MyAsyncFunction,2000)
,但当然这不会等到承诺解决后再再次调用该函数

我还尝试了
setInterval(async()=>await myasync function(),2000)
,但这基本上是一样的,因为我只是将它包装在另一个承诺中,在setInterval开始计时时解决它


是否有一种方法可以完成我试图使用setInterval所做的事情,或者是否有其他方法可以使用setTimeout完成此操作?

承诺只解析一次,因此根据定义,不能定期解析

如果您定义一个延迟函数,它返回一个在
timeout
ms之后解析的承诺

const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
您可以在异步循环中使用它:

async function foo(){
    for(let i = 0; i < 100; ++i){
        console.log("azrael");
        await delay(2000);
    }
}
异步函数foo(){ 对于(设i=0;i<100;++i){ 控制台日志(“死神”); 等待延迟(2000年); } }
如果您想调用异步函数,然后等待它,然后等待额外的固定时间,然后重复,您可以通过以下方式来实现

您可以从该函数本身调用setTimeout,因此它将在完成后安排下一次运行:

异步函数myAsyncFunction(){ 返回新承诺(resolve=>setTimeout(()=>{ resolve('result');//解析,然后 setTimeout(异步()=>{//计划 让结果=等待myAsyncFunction();//自调用 console.log('result')//并处理结果 },2000);//额外2秒后 },2000));//模拟具有2s延迟的异步函数 } 异步函数main(){ 让firstResult=等待myAsyncFunction(); console.log(firstResult);//处理第一次调用 } 更简洁的方法是将其包装到另一个异步函数中,其中包含相同的setTimeout:

异步函数myAsyncFunction(){ //模仿异步函数 返回新承诺(resolve=>setTimeout(()=>resolve('result'),2000)); } 异步函数delayLoop(){ 让结果=等待myAsyncFunction();//等待它 控制台日志(结果); setTimeout(delayLoop,2000);//在额外2秒后调用自身 } delayLoop(); 这样,您就不必修改原始异步函数代码并将回调放在其中


两个示例都将在第一个结果之前等待异步函数2s,在调用之间等待4s-2s异步函数延迟+2s额外延迟。您能分享您的代码吗?每2秒有一个承诺解决是什么意思?承诺的全部目的是处理不知道需要运行多长时间的事情。如果我们确实知道某个东西要运行多长时间(2秒),为什么需要在承诺中?承诺最多只能解决一次。你需要一些别的东西,比如一个可观测的。但是,如果您真正想做的是每两秒钟调用一个函数,只需将它放入一个循环中,并在其中添加一个
wait delay(2000)
。这样,只有在函数完成时才会启动。这与setInterval相同。也许问题并不是那个么清楚,但我认为,作者想要的是等待异步函数,然后等待额外的时间,而不是重复。因此,它不会每隔2秒调用一次异步函数,但会在前一次调用完成2秒后调用它。感谢您的编辑@LukasBach:)