从这篇开始,要悉心整理异步相关的知识了,我将把要点以笔记形式记录下来,至于传统的地狱式回调写法就先搁在一边吧。 先从 Promise 开始。 很好理解:无论结果成败,许下诺言,然后去做。
顺晟科技
2021-06-16 10:40:45
307
从这篇文章开始,要认真梳理异步的相关知识。我会以笔记的形式记录要点,抛开传统地狱般的回调写法。
先说承诺。
很容易理解:许下承诺,然后去做,不管成败。
三个州
在承诺对象的执行过程中有三种状态:待定(事务的悬停状态)、已完成(解决)和拒绝(拒绝)。
满足和拒绝都被设置(最终状态),只能触发一次,只返回一个状态(成功或失败)。
创造承诺
新承诺(功能(解决,拒绝){
//.
});
状态触发模式
在创建承诺的过程中,会适时调用“解决”(已完成的事情)和“拒绝”(已拒绝的事情),以抛出承诺对象的执行状态和结果(不会自动终止后面编写的代码的执行)。并在被Promise对象后续方法捕获后执行相应的回调。
Throw可以引发错误并通过。catch()。与reject()不同,throw终止后续代码的执行。
状态树
捕捉状态的方法。然后(onFulfilled,onRejected),它可以捕获两种状态,即已完成和已拒绝,由resolve或reject触发,并配置回调函数来处理这两种状态抛出的内容或执行后续进程。通常,这种方法是用来处理履行,而拒绝是移交。catch()。catch(onRejected),只处理被拒绝的状态。
另外,然后()不仅捕获状态,而且将回调函数中的返回结果(完成时,拒绝时)包装到带有Promise.resolve()的新Promise对象中,用于下一个链触发器。
例子
这里有一个重点。在Promise出现之前,我们可能需要使用setTimeout等“巫术”异步调用一段同步代码,Promise规范保证通过它执行的回调都是异步完成的。
let loading=false
让async=(条件)={
loading=true
返回新承诺(功能(解决,拒绝){
条件?
解决('祝贺你!'):
拒绝(新错误('抱歉!'));
});
};
异步(真)。然后((resolve)={
console . log(resolve);
}).catch((拒绝)={
console.error(拒绝);
});
console . log(' Starting ');//Promise规范保证每次调用都是异步进行的,所以程序执行时会在async()之前输出“Starting”。
执行的结果是先输出Starting,然后输出“恭喜!”。当然,您仍然可以在创建Promise对象时使用setTimeout和其他方法来设置延迟效果,以控制解决或拒绝的触发时间。
创造一条通往承诺的捷径
答应我。resolve(' fulfiltedthings ')相当于以下代码的语法糖:
新承诺(功能(解决,拒绝){
决心('完成的事情');
});
还有Promise.reject('被拒绝的东西')方法,会直接返回Promise对象,所以可以结合链式写:
承诺。拒绝('拒绝!').然后(null,(reject)={ alert(reject)});
console.log('Starting!');//仍将是预输出
乍一看,这个语法糖只是快速创建了一个带有最终状态的异步Promise对象。然而,如果你想很好地使用它,你必须提到一个概念——thenable
发展
//todo
嵌套,批量(所有,比赛),最后,完成…….