node mysql timeout_nodejs之setTimeout
問題一:如何實現一個循環定時執行的邏輯?
比如我有1000個請求,我想每一秒發一個。
const request = function(){
for(let i=0;i<1000;i++){
setTimeout(function(){
console.log('doRequest:'+i)
},1000)
}
}
request()
上面代碼可能不能實現預期效果,實際是到了1s后同時發了1000條請求。
為什么會這樣?我們先看看setTimeout到底做了什么事情?
可參考這篇文章:https://blog.csdn.net/THEANARKH/article/details/88374203
從文章分析結果我們可以知道setTimeout實際就是提前將回調函數添加到一個定時器的回調事件隊列中,等待定時器時計時超時的時候函數才會被執行。
所以我們這個例子中實際當前tick只是會一次性將1000個請求加入到回調事件隊列中,等到1s的tick到來時一次性執行這一組回調函數。
正確可參考實現代碼:
const sleep = function (ms){
return new Promise(resolve => setTimeout(resolve, ms))
}
const request = async function(){
for(let i=0;i<1000;i++){
console.log('request:'+i)
await sleep(1000)
}
}
通過promise+setTimeout實現一個sleep,然后使用await等待promise的timeout到時間再繼續執行下一次for循環。
問題2:setTimeout(fn,0)和setImmediate到底誰先執行?
const doTestImmediate = function(){
console.log('doTestImmediate')
}
const doTestTimeout = function(){
console.log('doTestTimeout')
}
setImmediate(doTestImmediate)
setTimeout(doTestTimeout,0)
運行結果1:
ideojjdeMacBook-Pro-6:asmp-ai-api videojj$ node test.js
doTestTimeout
doTestImmediate
運行結果2:
videojjdeMacBook-Pro-6:asmp-ai-api videojj$ node test.js
doTestImmediate
doTestTimeout
總體上結果是隨機的,不一定誰先執行。具體原因可參考這篇文章:
https://segmentfault.com/a/1190000013102056?utm_source=tag-newest
程序運行后看執行到目標代碼時機,setTimeout是以毫秒為單位計時,如果執行的時機已經過了1ms則setTimeout先執行,如果沒到則setImmediate先執行。
總結
以上是生活随笔為你收集整理的node mysql timeout_nodejs之setTimeout的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql里b树_MySQL-B树/B+
- 下一篇: mysql版本号超买_MySQL处理高并