function first(){
console.log('first')
}
function second(){
console.log('second')
}
let interval = async ()=>{
await setInterval(first,2000)
await setInterval(second,2000)
}
interval();
假设我有上面的代码。
当我运行它时,first()
和second()
将同时被调用;first)()
返回一些数据后,如何调用second()
,例如,如果first()
完成,则只调用second()
?
因为我的代码中的first()
将处理大量数据,如果同时调用这两个函数,服务器将很难处理。
每次first()
返回一些数据时,如何调用second()
?
8条答案
按热度按时间ktecyv1j1#
如上所述,
setInterval
不适用于承诺 *,如果您不停止它 *。如果您清除间隔,您可以使用它:以后您可以像这样使用它
83qze16e2#
你有几个问题:
1.承诺只能解析一次,
setInterval()
意味着多次调用回调,承诺不支持这种情况。1.无论是
setInterval()
还是更合适的setTimeout()
都不会返回Promises,因此,await
在此上下文中对它们执行操作是毫无意义的。您正在寻找一个函数,该函数返回一个Promise,该Promise在一段时间后解析(可能使用
setTimeout()
,而不是setInterval()
)。幸运的是,创建这样一个函数相当简单:
使用这个新的
delay
函数,您可以实现所需的流:bejyjqdl3#
setInterval
不能很好地处理promise,因为它多次触发回调,而promise解析一次。看起来
setTimeout
符合这个情况,为了和async..await
一起使用,应该对其进行承诺:relj7zay4#
await表达式会导致异步暂停,直到Promise得到解决
所以你可以直接得到承诺的结果,而无需等待
对我来说,我希望每1秒启动一次Http请求
toe950275#
可以使用IFFE,这样就可以避免
myInterval
不接受Promise作为返回类型的问题。有些情况下你需要
setInterval
,因为你想调用某个函数未知的次数,其间有一定的间隔。当我面对这个问题时,这对我来说是最直接的解决方案。我希望它能帮助到一些人:)对我来说,我想把日志发送到CloudWatch,但是尽量不要遇到Throttle异常,因为每秒发送的日志超过5个。所以我需要保留我的日志,并以1秒的间隔批量发送它们。我在这里发布的解决方案是我最终使用的。
uklbhaso6#
看了所有的答案,但仍然没有找到一个正确的工作,正是如何OP是问。这是我用同样的目的:
在我的示例中,我还放置了interval迭代计数和计时器本身,以防调用者需要对它做些什么。
lkaoscv77#
在我的例子中,我需要迭代一个图像列表,在每个图像之间暂停,然后在结束时暂停更长时间,然后重新循环。我通过结合上面的几种技术来实现这一点,递归调用我的函数并等待超时。如果在任何时候另一个触发器更改了我的
animationPaused:boolean
,我的递归函数将退出。kt06eoxx8#
Async/await不会使promises同步。据我所知,这只是
return Promise
和.then()
的语法不同。这里我重写了async函数,并保留了两个版本,这样你就可以看到它真正做了什么并进行比较。事实上,这是一个Promises的级联。你可以看到这两个异步函数同时执行,所以在这里使用promise和interval并不是很有用,因为它仍然只是interval,promise没有改变任何东西,而且会让事情变得混乱...
由于代码在一个区间内反复调用回调函数,我认为这是一种更简洁的方法:
此外,这个解决方案执行回调每秒钟.如果回调是异步请求,需要超过一秒来解决,我不能让他们重叠,那么,而不是做迭代调用与重复的时间间隔,我会得到请求解析调用下一个请求(通过一个计时器,如果我不想骚扰服务器).
这里的“递归”任务被称为lTask,它的功能与以前几乎相同,只是因为我不再有间隔,所以每次迭代都需要一个新的计时器。
下一步将是清空一个fifo与间隔,并填补它与网络请求承诺...