setInterval+async函数的问题

## 遇到的问题
showTip函数执行了两次
## 期望
showTip只执行一次
## 代码
```js
function watch (originPosition, originTime, originState) {
    var timer = setInterval(async function () {
        var endPosition = await getCurrentPosition()
        var endState = await getCurrentState()
        var conditions = [
            isTimeout(originTime, new Date()),
            isBeyondDistance(originPosition, endPosition),
            isStateChange(originState, endState)
        ]
        if (conditions.some(item => item)) {
            clearInterval(timer)
            showTip(!originState)
        }
    }, 1000)
}
```
阅读 8.1k
1 个回答

async异步函数,意味着该函数的执行不会阻塞后面代码的执行。
那么问题来了:定时器每1s执行一次,你不能确保两个 await 后的代码刚好在1000ms这段时间执行完毕并且执行到下方清理定时器的位置?
假如getCurrentPosition()和 getCurrentState()要执行999.99ms,这段时间内,下方if还没来得及判断就先被再一次执行定时器,这个时候清理掉定时器不能阻止已经执行的进程,因此它便会执行两次...

这个是我的理解,供你参考..

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题