node mysql timeout_nodejs之setTimeout
問(wèn)題一:如何實(shí)現(xiàn)一個(gè)循環(huán)定時(shí)執(zhí)行的邏輯?
比如我有1000個(gè)請(qǐng)求,我想每一秒發(fā)一個(gè)。
const request = function(){
for(let i=0;i<1000;i++){
setTimeout(function(){
console.log('doRequest:'+i)
},1000)
}
}
request()
上面代碼可能不能實(shí)現(xiàn)預(yù)期效果,實(shí)際是到了1s后同時(shí)發(fā)了1000條請(qǐng)求。
為什么會(huì)這樣?我們先看看setTimeout到底做了什么事情?
可參考這篇文章:https://blog.csdn.net/THEANARKH/article/details/88374203
從文章分析結(jié)果我們可以知道setTimeout實(shí)際就是提前將回調(diào)函數(shù)添加到一個(gè)定時(shí)器的回調(diào)事件隊(duì)列中,等待定時(shí)器時(shí)計(jì)時(shí)超時(shí)的時(shí)候函數(shù)才會(huì)被執(zhí)行。
所以我們這個(gè)例子中實(shí)際當(dāng)前tick只是會(huì)一次性將1000個(gè)請(qǐng)求加入到回調(diào)事件隊(duì)列中,等到1s的tick到來(lái)時(shí)一次性執(zhí)行這一組回調(diào)函數(shù)。
正確可參考實(shí)現(xiàn)代碼:
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)
}
}
通過(guò)promise+setTimeout實(shí)現(xiàn)一個(gè)sleep,然后使用await等待promise的timeout到時(shí)間再繼續(xù)執(zhí)行下一次for循環(huán)。
問(wèn)題2:setTimeout(fn,0)和setImmediate到底誰(shuí)先執(zhí)行?
const doTestImmediate = function(){
console.log('doTestImmediate')
}
const doTestTimeout = function(){
console.log('doTestTimeout')
}
setImmediate(doTestImmediate)
setTimeout(doTestTimeout,0)
運(yùn)行結(jié)果1:
ideojjdeMacBook-Pro-6:asmp-ai-api videojj$ node test.js
doTestTimeout
doTestImmediate
運(yùn)行結(jié)果2:
videojjdeMacBook-Pro-6:asmp-ai-api videojj$ node test.js
doTestImmediate
doTestTimeout
總體上結(jié)果是隨機(jī)的,不一定誰(shuí)先執(zhí)行。具體原因可參考這篇文章:
https://segmentfault.com/a/1190000013102056?utm_source=tag-newest
程序運(yùn)行后看執(zhí)行到目標(biāo)代碼時(shí)機(jī),setTimeout是以毫秒為單位計(jì)時(shí),如果執(zhí)行的時(shí)機(jī)已經(jīng)過(guò)了1ms則setTimeout先執(zhí)行,如果沒到則setImmediate先執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的node mysql timeout_nodejs之setTimeout的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql里b树_MySQL-B树/B+
- 下一篇: python 字典取值加引号创建一个对象