function first(){
console.log(\'first\')
}
function second(){
console.log(\'second\')
}
let interval = async ()=>{
await setInterval(first,2000)
await set
setInterval
doesn't play well with promises because it triggers a callback multiple times, while promise resolves once.
It seems that it's setTimeout
that fits the case. It should be promisified in order to be used with async..await
:
async () => {
await new Promise(resolve => setTimeout(() => resolve(first()), 2000));
await new Promise(resolve => setTimeout(() => resolve(second()), 2000));
}
As mentioned above setInterval
does not play well with promises if you do not stop it. In case you clear the interval you can use it like:
async function waitUntil(condition) {
return await new Promise(resolve => {
const interval = setInterval(() => {
if (condition) {
resolve('foo');
clearInterval(interval);
};
}, 1000);
});
}
Later you can use it like
const bar = waitUntil(someConditionHere)
await expression causes async to pause until a Promise is settled
so you can directly get the promise's result without await
for me, I want to initiate Http request every 1s
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)
You have a few problems:
setInterval()
is meant to call the callback multiple times, Promises do not support this case well.setInterval()
, nor the more appropriate setTimeout()
return Promises, therefore, await
ing on them is pointless in this context.You're looking for a function that returns a Promise which resolves after some times (using setTimeout()
, probably, not setInterval()
).
Luckily, creating such a function is rather trivial:
async function delay(ms) {
// return await for better async stack trace support in case of errors.
return await new Promise(resolve => setTimeout(resolve, ms));
}
With this new delay
function, you can implement your desired flow:
function first(){
console.log('first')
}
function second(){
console.log('second')
}
let run = async ()=>{
await delay(2000);
first();
await delay(2000)
second();
}
run();