国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

如何優(yōu)雅地寫JS串行異步邏輯

瀏覽:107日期:2024-05-24 08:36:43

隨著現(xiàn)代瀏覽器的不斷發(fā)展,相信大家漸漸對ES6中的Promise已經(jīng)有很多的使用了,其中對Promise.all估計也用的很多。Promise.all就是并行執(zhí)行多個任務(wù),然后在所有任務(wù)成功后觸發(fā)then里面的內(nèi)容,或者任意一個任務(wù)失敗后觸發(fā)catch里面的內(nèi)容。

雖然Promise.all非常好用,但它也不是適合所有的場景,最常見的就是有些場景是需要串行的,一個任務(wù)列表要按順序依次循環(huán)執(zhí)行,任意一個失敗就不觸發(fā)下面的任務(wù)。那要實(shí)現(xiàn)這樣的功能能怎么寫呢?

最簡單的就是一個個寫

var a = ()=>{return new Promise((resolve, reject) => { setTimeout(resolve, 1000);});}var b = ()=>{return new Promise((resolve, reject) => { setTimeout(resolve, 1000);});}var c = ()=>{return new Promise((resolve, reject) => { setTimeout(resolve, 1000);});}a().then(()=>{ return b()}).then(()=>{ return c()}).then(()=>{ console.log(’after 3 sec’)})

這樣寫。。。真的好挫,更重要的是,有時候需要批量處理一個任務(wù),都是調(diào)用同一個函數(shù)處理不定長度的數(shù)據(jù),這樣寫肯定就不行了,比如要串行請求一串url。首先想到的是一個比較繞的方法,搞個Promise鏈出來,把下一個任務(wù)作為參數(shù)傳到前一個的then中,如此循環(huán)。這種同一個函數(shù)不斷循環(huán)然后把前一個處理完的值又傳到參數(shù)里面,剛好和Array.reduce的思想是一致的,所以可以這么寫:

var urlArr = [’http://www.qq.com’,’http://www.qq.com’,’http://www.qq.com’];function makaPromiseList(dataArr,handler) { return dataArr.reduce((promise, obj) => {return promise.then((ret) => { return handler(obj);}) }, Promise.resolve())}var result = [];function makeRequest(url){ return new Promise((resolve,reject)=>{$.get(url).success((ret)=>{ result.push(ret) resolve(result)}).fail(()=>{ reject()}) })}makaPromiseList(urlArr,makeRequest).then((result)=>{ console.log(result)});

老師不給力啊,理解起來就很繞,還要在閉包外面定義result存數(shù)據(jù),用上reduce也覺得有點(diǎn)奇技淫巧,不太美觀啊,能不能寫得更好看點(diǎn)啊。 可以!說起異步方案,Promise是很強(qiáng),但它還不是最強(qiáng)的,還有Promise的進(jìn)階版 —— async/await!號稱JS異步的終極解決方案,真不是蓋的,下面就來看看async/await的方案

var urlArr = [’http://www.qq.com’,’http://www.qq.com’,’http://www.qq.com’];function makeRequest(url){ return new Promise((resolve,reject)=>{$.get(url).success((ret)=>{ resolve(ret)}).fail(()=>{ reject()}) })}async function makaPromiseList(dataArr,handler){ var result = []; for(let item of dataArr){var ret = await handler(item);result.push(ret); } return result;}makaPromiseList(urlArr,makeRequest).then((ret)=>{ console.log(ret)});

一個for循環(huán)解決串行異步問題,沒有回調(diào)沒有嵌套看起來瞬間舒服多了~

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 草草日| 免费欧美一级 | 91精品欧美成人 | 成人高清视频在线观看 | 特级生活片 | 成人欧美网站 | 午夜视频一区二区 | 免费一级毛片不卡在线播放 | 日本一级毛片高清免费观看视频 | 亚洲国产最新在线一区二区 | 99久久精品自在自看国产 | 91刘亦菲精品福利在线 | 欧美日韩午夜视频 | 一区二区视屏 | a级国产乱理伦片在线观看国 | 国产香蕉久久 | 色婷婷久久综合中文久久蜜桃 | 国产在线综合一区二区三区 | 综合亚洲欧美日韩一区二区 | 男人的天堂精品国产一区 | 国产亚洲精品久久久久久久久激情 | 成人在线视频一区 | 精品视频免费在线观看 | 日韩三级在线观看视频 | 亚洲天堂成人 | 久久精品国产半推半就 | 在线看片 在线播放 | 91亚洲精品一区二区在线观看 | 中国的毛片 | 韩国一级特黄清高免费大片 | 久久网在线| 欧美色综合高清视频在线 | 欧美日韩另类视频 | 精品国产成人a区在线观看 精品国产成人a在线观看 | 国产真实女人一级毛片 | 久久99精品久久久久久秒播 | 久久91精品国产91久久跳舞 | 久久91综合国产91久久精品 | www亚洲一区| 国产成人精品综合 | freese×video性欧美丝袜 |