手机版

谈论承诺在JavaScript中的使用

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

阅读目录

Prmoise Promise有什么用?最近看了《你不知道的javascript中卷》,发现作者用了差不多一半的篇幅在讲异步和承诺,觉得有必要总结一下。

其实这篇文章的目的是写一篇手抄的Promise,但是我觉得有点长,所以不得不分成两部分。我会先介绍诺言的用法,在我们知道怎么写之前先知道怎么用,所以我把手写诺言的任务放到了下一篇文章中。

当然网上有很多关于诺言的文章,可以参考,包括错误和欢迎的地方。

什么是Prmoise

Promise是ES6的一个新特性,已经包含在ES6的官方规范中

Promise对象可以理解为一次执行的异步操作。使用Promise对象后,可以使用链式调用来组织代码;让代码更直观。也就是说,有了Promise对象,异步操作可以用同步操作的流程来表示,避免了嵌套回调函数。

示例:没有使用promise,回调必须逐层嵌套

$.ajax(url1,function(data1){ //做点什么.$.ajax(url2,function(data2){ //做点什么.$.ajax(url3,function(data3){ //做点什么.完成(数据3);//返回数据})});});如果有多个嵌套,代码不直观,如果几个操作之前没有顺序,需要等待最后一个操作完成后才能进行下一个操作,造成不必要的等待

承诺是为了解决这些问题而创造的。

承诺对象的特征:

1、物体的状态不受外界影响。

Promise对象表示具有三种状态的异步操作

待定(执行中)已解决(成功,也称为已履行)已拒绝(拒绝),其中待定是初始状态,履行和拒绝是结束状态(结束状态表示承诺的生命周期已经结束)。

Promise只是异步操作的结果,异步操作可以决定它当前处于哪种状态,其他任何操作都无法改变这种状态。

2.状态一旦改变,就不会再改变,这个结果随时都可以得到。

只有两种可能可以更改Promise对象的状态:从“待定”更改为“已解决”以及从“待定”更改为“已拒绝”

待定-完成,待定-拒绝.

只要这两种情况发生,状态就会固化,不会再改变,这个结果会一直保持下去

承诺对象的缺点:

1.承诺不能取消。一旦创建,就会立即执行,不能中途取消。

2.如果没有设置回调函数,Promise内部抛出的错误不会反映到外部。

3.当它处于待定状态时,不可能知道进度已经到达哪个阶段(刚刚开始或即将完成)。

承诺兼容性

除了旧的浏览器IE和安卓的一些较低版本,现代浏览器的支持相当不错,所以我们可以直接在谷歌的控制台上测试我们的代码

承诺的使用

提前说明以下代码示例可以复制到谷歌的控制台进行测试!

1.基本用法:

(1)首先,我们新建一个Promise并实例化该Promise

(2)然后可以在实例化的承诺中传递两个参数,一个是成功后解析,另一个是失败后拒绝

(3)生成Promise实例后,可以用then方法分别指定Resolved状态和Reject状态的回调函数

代码如下:

var promise=function(isReady){返回新Promise(function(resolve,reject){ //do somthing,也许async if (isReady){返回resolve(' hello world ');} else { return reject(' fail ');} });}//生成{//Promise实例后,可以通过then方法指定Resolved状态和Reject状态的回调函数。承诺(真实)。然后(函数(值){//成功,这里是解析的回调函数console.log(值);//hello world},函数(err){//失败,这里是reject的回调函数console.log(err)}。)以上代码执行成功,返回helloworld。如果你想在失败后测试返回值,你可以把它改成promise(false)。然后.

2.连锁经营

也许你会说,Promise只是简化了逐层回调的编写,但实际上并非如此。其本质是通过维护状态和转移状态来及时进行回调调用。所以相比回调,承诺更灵活,更简单。我们来看看Promise的连锁经营:

makePromise1()。然后(function(value){ console . log(value);返回MakePromise 2();}).然后(function(value){ console . log(value);返回MakePromise3();}).然后(function(value){ console . log(value);});函数makepromise1 () {var p=newpromise(函数(解析,拒绝){//异步操作settimeout(函数(){console.log('异步任务1 ')));解析('异步任务1传递的值');}, 2000);});返回p;} function make promise 2(){ var p=new promise(function(resolve,reject){//异步操作settimeout(function(){ console . log('异步任务2 ')));解析('异步任务2传递的值');}, 2000);});返回p;} function make promise 3(){ var p=new promise(function(resolve,reject){//异步操作settimeout(function(){ console . log('异步任务3 ')));解析('异步任务3传递的值');}, 2000);});返回p;}在上面的代码中,我们有三个异步操作,makepromise1、makepromise2和makepromise3。其中,第二个和第三个依次执行,即在前一个操作完成后执行。

输出值为:

异步任务1异步任务1来自异步任务2的值异步任务2来自异步任务3的值异步任务3来自异步任务3的值捕获Promise的方法

var promise=function(isReady){返回新Promise(function(resolve,reject){ //do somthing,也许async if (isReady){返回resolve(' hello world ');} else { return reject(' fail ');} });}承诺(真实)。然后(function(value){ console . log(' resolved ');console.log(值);console.log(哈哈);//这里没有定义哈哈})。catch(函数(错误){console.log('拒绝');console.log(错误);});Catch方法是在then(onFulfilled,onRejected)方法中编写onRejected函数的简单方法,也就是说可以写成then(fn)。catch(fn),相当于then(fn)。然后(空,fn)

使用catch的编写方法比一般的编写方法更清晰,可以比作try/catch,这样错误就不会阻塞操作。比如你定义了一个未定义的哈哈,上面的代码就不会正常运行,因为被这个错误屏蔽了。有了catch,上面的代码可以正常运行:

控制台上打印的内容:

已解决你好世界拒绝参考错误:哈哈未定义(…) 4。承诺。所有方法

Promise.all可以接收一个数组,该数组的元素是Promise对象作为参数,并且只有当该数组中的所有Promise对象都被解析时,该方法才会返回。

代码示例:

var P1=new promise(function(resolve){ settimeout(function(){ resolve(' first promise ')));}, 3000);});var p2=new promise(function(resolve){ settimeout(function(){ resolve('第二个promise ')));}, 1000);});Promise.all([p1,p2])。然后(函数(结果){ console.log(结果);//['第一承诺','第二承诺']});在上面的代码中,all接收一个数组作为参数,并行执行P1和p2,然后在两者都执行之前不会输入。all将把所有结果放入一个数组中并返回,因此我们将结果打印为一个数组。

值得注意的是,虽然p2的执行顺序比p1快,但都将根据参数中的数组顺序返回结果。所有的使用场景都是相似的。玩游戏的时候,需要在初始化页面之前提前准备好游戏所需的资源。

5.诺言竞赛法

比赛在中文里是赛跑的意思,也就是说谁跑得快谁就赢。因此,promise.race也在数组中传递,但与promise.all不同,race只返回运行速度快的值,即result返回执行速度较快的值。

var P1=new Promise(function(resolve)){ setTimeout(function(){ console . log(1);决心(“第一个承诺”);}, 3000);});var p2=new Promise(函数(resolve) { setTimeout(函数(){ console . log(2));决心(“第二承诺”);}, 1000);});Promise.race([p1,p2])。然后(函数(结果){ console.log(结果);});//结果://2//第二个承诺//1。可以看到,在传递的值中,只有p2返回了,但是p1没有停止,还在执行。

race的应用场景是,例如,我们可以将网络请求设置为超时。写两个承诺。如果我们在一定时间内没有实施成功的,我们将实施失败的。这里没有更多的例子。你可以看看阮一峰对ES的介绍。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

版权声明:谈论承诺在JavaScript中的使用是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。