使用setInterval异步等待

时间:2018-09-05 11:40:55

标签: node.js promise async-await

function first(){
  console.log('first')
}
function second(){
  console.log('second')
}
let interval = async ()=>{
  await setInterval(first,2000)
  await setInterval(second,2000)
}
interval();

想象一下我上面有这段代码。

当我运行它时,将同时调用first()second();在second()返回一些数据之后如何调用first)(),例如,如果完成了first(),则仅调用second()

因为我的代码中的first()将处理大量数据,并且如果同时调用这2个函数,则对于服务器而言将非常困难。

second()每次返回一些数据时如何调用first()

4 个答案:

答案 0 :(得分:6)

您遇到一些问题:

  1. 承诺只能解析一次,setInterval()可以多次调用回调,承诺不能很好地支持这种情况。
  2. setInterval()和更合适的setTimeout()都不返回Promises,因此,在这种情况下,await的使用是毫无意义的。

您正在寻找一个返回Promise的函数,该函数会在一段时间后解析(使用setTimeout(),可能不是setInterval())。

幸运的是,创建这样的函数很简单:

async function delay(ms) {
  // return await for better async stack trace support in case of errors.
  return await new Promise(resolve => setTimeout(resolve, ms));
}

使用此新的delay函数,您可以实现所需的流程:

function first(){
  console.log('first')
}
function second(){
  console.log('second')
}
let run = async ()=>{
  await delay(2000);
  first();
  await delay(2000)
  second();
}
run();

答案 1 :(得分:2)

setInterval不能很好地满足诺言,因为它会多次触发回调,而诺言只能解析一次。

似乎setTimeout符合情况。为了与async..await一起使用,应予以说明:

async () => {
  await new Promise(resolve => setTimeout(() => resolve(first()), 2000));
  await new Promise(resolve => setTimeout(() => resolve(second()), 2000));
}

答案 2 :(得分:2)

如上所述,-NewFolderButton不能很好地履行诺言,如果您不停止兑现。如果您清除间隔,可以像这样使用它:

setInterval

以后您可以像使用它

async function waitUntil(condition) {
  return await new Promise(resolve => {
    const interval = setInterval(() => {
      if (condition) {
        resolve('foo');
        clearInterval(interval);
      };
    }, 1000);
  });
}

答案 3 :(得分:0)

await表达式导致异步暂停,直到解决承诺

因此您无需等待即可直接获得承诺的结果

对我来说,我想每1秒发起一次Http请求

let intervalid 
async function testFunction() {
    intervalid = setInterval(() => {
        // I use axios like: axios.get('/user?ID=12345').then
        new Promise(function(resolve, reject){
            resolve('something')
        }).then(res => {
            if (condition) {
               // do something 
            } else {
               clearInterval(intervalid)
            }    
        })  
    }, 1000)  
}
// you can use this function like
testFunction()
// or stop the setInterval in any place by 
clearInterval(intervalid)