在java中線程有sleep函數(shù)可以延遲執(zhí)行,但是在js中并沒有這樣的函數(shù)。
唯一有的就是setTimeout延遲執(zhí)行函數(shù),但是這個(gè)函數(shù)也是有很多坑。
for (var i = 0; i < 6; i++) {
setTimeout(function () {
console.log(i);
}, 1000)
}//結(jié)果是6個(gè)6
場景:由于js是單線程異步執(zhí)行的,當(dāng)調(diào)用第三方API接口時(shí),如果對方?jīng)]有提供批量操作的接口,我們就需要多次請求相同的API,但是在for語句中會同時(shí)去訪問多個(gè)相同請求,會造成并發(fā)沖突。
這個(gè)時(shí)候需要延遲執(zhí)行請求,避免程序錯(cuò)誤。
let dataArray=[];
function apiRequest(val){
}
for (var i = 0; i < dataArray.length; i++) {
setTimeout(apiRequest(dataArray[i]), 1000); // 意圖每秒執(zhí)行一次,不是累加的
}//error,并發(fā)沖突
單純使用setTimeout函數(shù),最后發(fā)現(xiàn)延遲1s后還是一起執(zhí)行了內(nèi)部函數(shù),造成沖突。
思路是每個(gè)setTimeout函數(shù)延遲不同的時(shí)間1000 * i。文章來源:http://www.zghlxwxcb.cn/news/detail-523801.html
let dataArray=[];
function apiRequest(val){
}
for (var i = 0; i < dataArray.length; i++) {
(function (t, func, data) {
// 注意這里是形參
setTimeout(function () {
func(data);
}, 1000 * t); // 還是每秒執(zhí)行一次,不是累加的
})(i, apiRequest, dataArray[i]); // 注意這里是實(shí)參,這里把要用的參數(shù)傳進(jìn)去
}
同時(shí),由于setTimeout函數(shù)的作用域不能訪問外部函數(shù),需要通過匿名函數(shù)傳遞外部參數(shù)進(jìn)去。文章來源地址http://www.zghlxwxcb.cn/news/detail-523801.html
到了這里,關(guān)于JavaScript:延遲訪問和延時(shí)執(zhí)行函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!