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()
?
答案 0 :(得分:6)
您遇到一些问题:
setInterval()
可以多次调用回调,承诺不能很好地支持这种情况。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)