电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:117日期: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ù)。那要實現(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也覺得有點奇技淫巧,不太美觀啊,能不能寫得更好看點啊。 可以!說起異步方案,Promise是很強,但它還不是最強的,還有Promise的進階版 —— 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)文章:
主站蜘蛛池模板: 聚丙烯酰胺_阴离子_阳离子「用量少」巩义亿腾厂家直销,售后无忧 聚合甘油__盐城市飞龙油脂有限公司 | 发电机价格|发电机组价格|柴油发电机价格|柴油发电机组价格网 | 胀套-锁紧盘-风电锁紧盘-蛇形联轴器「厂家」-瑞安市宝德隆机械配件有限公司 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 包装盒厂家_纸盒印刷_礼品盒定制-济南恒印包装有限公司 | SMN-1/SMN-A ABB抽屉开关柜触头夹紧力检测仪-SMN-B/SMN-C-上海徐吉 | 信阳市建筑勘察设计研究院有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 欧洲MV日韩MV国产_人妻无码一区二区三区免费_少妇被 到高潮喷出白浆av_精品少妇自慰到喷水AV网站 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 布袋式除尘器|木工除尘器|螺旋输送机|斗式提升机|刮板输送机|除尘器配件-泊头市德佳环保设备 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 【同风运车官网】一站式汽车托运服务平台,验车满意再付款 | 气动隔膜泵厂家-温州永嘉定远泵阀有限公司| 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 丝印油墨_水性油墨_环保油墨油漆厂家_37国际化工 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 贵州自考_贵州自学考试网| PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | 中药超微粉碎机(中药细胞级微粉碎)-百科| 协议书_协议合同格式模板范本大全 | 宜兴紫砂壶知识分享 - 宜兴壶人 医用空气消毒机-医用管路消毒机-工作服消毒柜-成都三康王 | 实木家具_实木家具定制_全屋定制_美式家具_圣蒂斯堡官网 | 亿诺千企网-企业核心产品贸易 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 破碎机锤头_耐磨锤头_合金锤头-鼎成机械一站式耐磨铸件定制服务 微型驱动系统解决方案-深圳市兆威机电股份有限公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 好杂志网-首页| 深圳市八百通智能技术有限公司官方网站 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 分类168信息网 - 分类信息网 免费发布与查询 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 |