JS中优雅的使用async await(1),看完没有不懂的

// success !!! do something…

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

不可否认,$.ajax 这个东西还是挺好使的,在面对大部分场景只有一个请求的情况下,完全胜任甚至觉得很棒116e3ccd8c225ae4ee390b2da0b2aa61.png但是有个大大的问题,那就是面对请求链的时候就会特别特别的糟心,比如一个请求依赖于另一个请求的结果,两个可能还无所谓,要是五个八个的,可能想要直接自杀。。。

$.ajax(‘/xxx1’)

.done(function() {

// success !!! do something…

$.ajax(‘/xxx2’)

.done(function() {

// success !!! do something…

$.ajax(‘/xxx3’)

.done(function() {

// success !!! do something…

$.ajax(‘/xxx4’)

.done(function() {

// success !!! do something…

$.ajax(‘/xxx5’)

.done(function() {

// success !!! do something…

// more…

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

})

.fail(function() {

// fail !!! do something…

$.ajax(‘/xxx6’)

.done(function() {

// success !!! do something…

$.ajax(‘/xxx7’)

.done(function() {

// success !!! do something…

// more…

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

})

.always(function() {

// loading finished…

});

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

})

.fail(function() {

// fail !!! do something…

})

.always(function() {

// loading finished…

});

f0b50e3e56892e121154bbaa912f2372.png抱歉,我不知道你可以套这么多层。。。,但事实就是TM经常出现这样的流程,大伙儿说说,这不能怪产品吧???只能怪自己学艺不精f68187ccf79311e4e24da099aa75880f.png  像这样链式操作,我觉得吧,是个人可能都是奔溃的,先不说代码的可读性,就拿天天在变化的产品需求来说,也许先前是 请求1 结束之后紧接着 请求2请求3 ,后面产品大手一挥,我觉得这个流程不大对,后面就变成了 请求2请求3请求1,这尼玛套娃怎么改?可能有人会有疑问,为啥不用 axiosawaitasync 呢?这个就不得不提项目代码是08年开写的JSP了。。。。在整了大半年的屎上拉屎以后,迎来了大大的转机,新写的项目开始往 Vue 上面转,并且放弃一部分兼容性,我TM直接起飞。。。

Webpack时代的开始

新的项目直接Vue + Webpack,我直接就给安排上 axiosawaitasync ,现在代码非常好使,嵌套N层的代码没了

const r1 = await doSomthing1();

if (r1.xxx === 1) {

const r2 = await doSomthing2(r1);

const r3 = await doSomthing3(r2);

// do something…

} else {

const r4 = await doSomthing4(r1);

const r5 = await doSomthing5(r4);

// do something…

}

// do something…

但是上面的代码存在一个问题,如果某个任务报错,那么代码直接就终止了。。。这样不符合我们的预期啊,那我们加上 try catch

let r1;

try {

r1 = await doSomthing1();

} catch (e) {

// do something…

return;

}

if (r1) {

if (r1.xxx === 1) {

let r2;

try {

r2 = await doSomthing2(r1);

} catch (e) {

// do something…

return;

}

if (r2) {

let r3;

try {

r3 = await doSomthing3(r2);

} catch (e) {

// do something…

return;

}

// do something…

}

} else {

let r4;

try {

r4 = await doSomthing4(r1);

} catch (e) {

// do something…

return;

}

if (r4) {

let r5;

try {

r5 = await doSomthing5(r4);

} catch (e) {

// do something…

return;

}

}

// do something…

}

// do something…

}

???92d64344f5e96375552617b14103ef1f.png优化了,等于没优化。。。df73f7cd519c58940afc8dfa7c501a91.png这时候我想聪明的小伙伴可能会说了,这是啥煎饼玩意儿。而呆滞的小伙伴已经开始想怎么解决这样的问题了。。。

深入了解Promise

我们来看一下 Promise[2] 的定义

/**

* Represents the completion of an asynchronous operation

*/

interface Promise {

/**

* Attaches callbacks for the resolution and/or rejection of the Promise.

* @param onfulfilled The callback to execute when the Promise is resolved.

* @param onrejected The callback to execute when the Promise is rejected.

* @returns A Promise for the completion of which ever callback is executed.

*/

then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): Promise<TResult1 | TResult2>;

/**

* Attaches a callback for only the rejection of the Promise.

* @param onrejected The callback to execute when the Promise is rejected.

* @returns A Promise for the completion of the callback.

*/

catch<TResult = never>(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): Promise<T | TResult>;

}

thencatch 都会返回一个新的 Promise ,我相信很多小伙伴都已经想到了怎么解决方法,需要使用 try catch 是因为它会报错,那我们返回一个 永远不会报错的结果 不就行了?说干就干

消灭嵌套

function any(promise) {

return promise.then((v) => v).catch((_) => null);

}

这样就完全解决了啊???通过判断是否有值来判断是否成功,就不用再写 try catch 了,但是这样的代码有点不大好使,如果 then 返回的是一个 void 那么就完犊子了,一个 undefined 一个 null ,这还判断个锤子,我们再来改进一下

function any(promise) {

return promise

.then((v) => ({ ok: v, hasErr: false }))

.catch((e) => ({ err: e, hasErr: true }));

}

使用的话

const r = await any(doSomething());

if (r.hasErr) {

console.log(r.err);

return;

}

console.log(r.ok);

现在看起来是不是很完美呢,赶紧和小伙伴推销一下。小伙伴:???这啥煎饼玩意儿,不用不用。我:这个我写的,在异步中用起来很好使的,告别嵌套 try catch ,巴拉巴拉。。。小伙伴:好的,下次一定用。1fe90cda35a0c59aede7658efb11db00.png大家肯定有遇到过这样的情况,大家写的代码互相看不起,只要不是三方库,大家都是能不用同事写的就不用。。。fd86b6ca4379588c20f2f5a4c13de18c.png

await-to-js

我都以为只有我一人欣赏,这一份优雅。事情出现转机,某天我正在刷github,发现了一个和我差不多异曲同工之妙的东西 await-to-js[3] ,几行代码透露了和我一样的执着

// 下面是最新的代码

/**

* @param { Promise } promise

* @param { Object= } errorExt - Additional Information you can pass to the err object

* @return { Promise }

*/

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可免费领取

发知识点,真正体系化!**

[外链图片转存中…(img-odGHfbBx-1712164642216)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。

分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可免费领取

[外链图片转存中…(img-n6OIt6xP-1712164642216)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值