<强>阅读目录强>
-
<李>什么是Prmoise李>
<李>承诺的使用李>
最近在看《你不知道的javascript中卷》,发觉作者花了基本一半的篇幅去讲异步和承诺,觉得有必要总结一下。
其实本文的目的是想手写一个承诺的,无奈总结着总结着发觉篇幅有点长,因此只好一分为二,先介绍承诺的用法,知道怎么用,我们才知道怎么写,所以把手写一个承诺的任务放到了下一篇文章当中。
当然,网上有很多关于承诺的文章,都可以参考参考,有误之处,欢迎之处。
<强>什么是Prmoise 强>
承诺是ES6新增的一个特征,它已被列入ES6的正式规范中
承诺对象可以理解为一次执行的异步操作,使用承诺对象之后可以使用一种链式调用的方式来组织代码,让代码更加的直观。也就是说,有了承诺对象,就可以将异步操作以同步的操作的流程表达出来,避免了层层嵌套的回调函数。
示例:未使用承诺,回调必须层层嵌套
美元。ajax (url1函数(data1) {//做某事… 美元。ajax (url2函数(data2) {//做某事… 美元。ajax (url3函数(data3) {//做某事… 完成(data3);//返回数据 }) }); });
如果有多个嵌套,导致代码不够直观,而且如果几个操作之前没有前后顺序之分,需要等待上一个操作完成才可以进行下一个操作,造成不必要的等待
就承诺是为了解决这些问题而产生的。
承诺对象代表一个异步操作,有三种状态
-
<李>待定(执行中)李>
<李>解决(成功,又称实现)李>
<李>拒绝(拒绝)李>
其中等待为初始状态,满足和拒绝为结束状态(结束状态表示承诺的生命周期已结束)。
承诺只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态. .
承诺对象的状态改变,只有两种可能:从等待变为解决和从等待变为拒绝
<代码>等待→完成,等待→拒绝。代码>
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果
1,无法取消承诺,一旦新建它就会立即执行,无法中途取消。
2,如果不设置回调函数,保证内部抛出的错误,不会反应到外部。
3,当处于等待状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
除了IE这种古老的浏览器和一些低版本的安卓外,现代浏览器支持还是挺好的,所以我们可以在谷歌的控制台直接测试我们的代码
<强>承诺的使用强>
先提前说明一下,下面的代码示例,都可以复制到谷歌的控制台就行测试! !
(1),首先我们新一个承诺,将承诺实例化
(2),然后在实例化的承诺可以传两个参数,一个是成功之后的决心,一个是失败之后的拒绝
(3),保证实例生成以后,可以用然后方法分别指定解决状态和拒绝状态的回调函数
代码如下:
var承诺=函数(isReady) { 返回新的承诺(函数(解决,拒绝){//做一些,也许异步 如果(isReady) { 返回解决(“hello world”); 其他}{ 返回拒绝(“失败”); } }); }//保证实例生成以后,可以用然后方法分别指定解决状态和拒绝状态的回调函数。 承诺(真正的),然后(功能(价值){//成功,这里是解决的回调函数 console.log(价值);//hello world }、功能(err) {//失败,这里是拒绝的回调函数 console.log (err) })
上述代码是执行成功,返回hello world,如果想测试一下失败后的返回值,可以在承诺(真)……这里改为承诺(false)…即可
也许你会说,承诺只是简化层层回调的写法而已吧,其实不然,它的精髓是通过维护状态,传递状态的方式来使回调方式能够及时的调用,因此,相比于回调,它更灵活,更简单。下面我们来看看承诺的链式操作:
makePromise1 () 不要犹豫(函数(值){ console.log(价值); 返回makePromise2 (); }) 不要犹豫(函数(值){ console.log(价值); 返回makePromise3 (); }) 不要犹豫(函数(值){ console.log(价值); }); 函数makePromise1 () { var p=新的承诺(函数(解决,拒绝){//异步操作 setTimeout(函数(){ console.log(“异步任务1 '); 解决(“异步任务1传过来的值'); },2000); }); 返回p; } 函数makePromise2 () { var p=新的承诺(函数(解决,拒绝){//异步操作 setTimeout(函数(){ console.log(“异步任务2 '); 解决(“异步任务2传过来的值'); },2000); }); 返回p; } 函数makePromise3 () { var p=新的承诺(函数(解决,拒绝){//异步操作 setTimeout(函数(){ console.log(“异步任务3 '); 解决(“异步任务3传过来的值'); },2000); }); 返回p; }浅谈JavaScript中承诺的使用