18910140161

为异步而生之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

嵌套,批量(所有,比赛),最后,完成…….

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航