携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
在我们知道js是的执行是异步执行的,异步是一个什么概念的,我是这样理解的,在学习计算机组成远离的时候,有一种运行方式是多路复用,就是同一个任务在不同的进度中会调用不同的系统,类似的JS中也是这样,有时一个函数会发出http请求,而http请求是需要时间的,这个时间js进程不会持续等待,而是转头执行下面的代码,等请求发送出去并获得响应后,重新排队到进程中进行处理。而我在这个时间段内想要使用这个数据,就只能等待了,js是不会等待的,这就是同步,这时我们有什么方案呢,设置定时器等待?还是设置一个递归循环?好像也都能解决,但是差点意思,差点什么呢?优雅
唯一比不知道代码为什么崩溃更可怕的事情是,不知道为什么一开始它是工 作 的 ! 这 就 是 经 典 的 “ 纸 牌 屋 ” 心 理 :“ 它 可 以 工 作 , 可 我 不 知 道 为 什 么 , 所 以 谁 也 别 碰 它 ! ” 你 可 能 听 说 过 “ 他 人 即 地 狱 ”( 萨 特 ) 这 种 说 法 , 对 程 序员来说则是“他人的代码即地狱”。而我深信不疑的是:“不理解自己的代 码才是地狱。”回调就是主要元凶之一。
如果是程序员有追求,那么这个追求必须是优雅。
试想一下,我们想要运行一个 X+Y 这个算数运算。但是呢,不知道X 或 Y是否准备好了,如果其中有一方没准备好,就等两者都准备好。一旦都准备好就马上执行X+Y,可能你想到了回调
function add(getX,getY,cb) {
var x, y;
getX( function(xVal){
x = xVal;
// 两个都准备好了?
if (y != undefined) {
cb( x + y ); // 发送和
}
} );
getY( function(yVal){
y = yVal;
// 两个都准备好了?
if (x != undefined) {
cb( x + y ); // 发送和
}
} );
}
// fetchX() 和fetchY()是同步或者异步函数
add( fetchX, fetchY, function(sum){
console.log( sum ); // 是不是很容易?
} );
看着这段代码不🈲思索,嗯···,这,好像能实现但是,我不想写它。
那来用Promise吧 Primise.all[]老好用了,看all的参数是个数组,说明我们要传入事件可以有多个,多个事件全部执行完毕,才会被决议为成功。那修改一下上述代码就是add函数中return一个Promise.all[getX,getY].then(value => value[1]+value[2])这样就可以了
Promise的其他几个模式
- Promise.race([...]) 竞赛的意思是什么,最快的,所以它返回第一个执行完毕的决议,不管它是成功或失败
- none([...]) 这个类似all,all是全部成功决议,这个是全部失败决议
- any([]) 这个也是类似all([]) 但是会忽略拒绝的决议,只要有一个决议完成,就执行then
- first([]) 这个类似any,即只要第一个决议完成,就会忽略后续的决议
- last([]) 看名字就和上一个first类似啦,最后一个完成的会胜出