当前位置: 首页 > news >正文

滨州网站建设铭盛信息宁波网站建设 熊掌号

滨州网站建设铭盛信息,宁波网站建设 熊掌号,西安企业名录黄页,python如何做网站学习了promise之后,有点懂但让我说又说不出来,参考别人的记录一下。 1.什么是promise? 2.promise解决了什么问题 3.es6 promise语法 (1)then链式操作语法 (2)catch的语法 (3&#xf…

学习了promise之后,有点懂但让我说又说不出来,参考别人的记录一下。

1.什么是promise?

2.promise解决了什么问题

3.es6 promise语法

(1)then链式操作语法

(2)catch的语法

(3)all的语法

(4)race的语法

一、什么是Promise?我们用Promise来解决什么问题?

1.什么是promise?

Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

2.promise解决了什么问题?

  • 回调地狱问题。代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
  • promise可以支持多个并发的请求,获取并发请求中的数据

这个promise可以解决异步的问题,本身不能说promise是异步的

 二、es6 promise用法大全

Promise是一个构造函数,自己身上有all、reject、resolve这几个眼熟的方法,原型上有then、catch等同样很眼熟的方法。

那就new一个

let p = new Promise((resolve, reject) => {//做一些异步操作setTimeout(() => {console.log('执行完成');resolve('我是成功!!');}, 2000);
});

Promise的构造函数接收一个参数:函数,并且这个函数需要传入两个参数:

  • resolve :异步操作执行成功后的回调函数
  • reject:异步操作执行失败后的回调函数

then 链式操作的用法  :

从表面上看,Promise只是能够简化层层回调的写法,而实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多。所以使用Promise的正确场景是这样的:

p.then((data) => {console.log(data);
})
.then((data) => {console.log(data);
})
.then((data) => {console.log(data);
});

reject的用法 :

把Promise的状态置为rejected,这样我们在then中就能捕捉到,然后执行“失败”情况的回调。看下面的代码。

    let p = new Promise((resolve, reject) => {//做一些异步操作setTimeout(function(){var num = Math.ceil(Math.random()*10); //生成1-10的随机数if(num<=5){resolve(num);}else{reject('数字太大了');}}, 2000);});p.then((data) => {console.log('resolved',data);},(err) => {console.log('rejected',err);}); 

 then中传了两个参数,then方法可以接受两个参数,第一个对应resolve的回调,第二个对应reject的回调。所以我们能够分别拿到他们传过来的数据。多次运行这段代码,你会随机得到下面两种结果:                    

或者 

 catch的用法

我们知道Promise对象除了then方法,还有一个catch方法,它是做什么用的呢?其实它和then的第二个参数一样,用来指定reject的回调。用法是这样:

p.then((data) => {console.log('resolved',data);
}).catch((err) => {console.log('rejected',err);
});

效果和写在then的第二个参数里面一样。不过它还有另外一个作用:在执行resolve的回调(也就是上面then中的第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个catch方法中。请看下面的代码: 

p.then((data) => {console.log('resolved',data);console.log(somedata); //此处的somedata未定义
})
.catch((err) => {console.log('rejected',err);
});

在resolve的回调中,我们console.log(somedata);而somedata这个变量是没有被定义的。如果我们不用Promise,代码运行到这里就直接在控制台报错了,不往下运行了。但是在这里,会得到这样的结果:

 也就是说进到catch方法里面去了,而且把错误原因传到了reason参数中。即便是有错误的代码也不会报错了,这与我们的try/catch语句有相同的功能

all的用法:谁跑的慢,以谁为准执行回调。all接收一个数组参数,里面的值最终都算返回Promise对象

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。看下面的例子:

let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})let p = Promise.all([Promise1, Promise2, Promise3])p.then(funciton(){// 三个都成功则成功  
}, function(){// 只要有失败,则失败 
})

有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据,是不是很酷?有一个场景是很适合用这个的,一些游戏类的素材比较多的应用,打开网页时,预先加载需要用到的各种资源如图片、flash以及各种静态文件。所有的都加载完后,我们再进行页面的初始化。

race的用法:谁跑的快,以谁为准执行回调

race的使用场景:比如我们可以用race给某个异步请求设置超时时间,并且在超时后执行相应的操作,代码如下:

 //请求某个图片资源function requestImg(){var p = new Promise((resolve, reject) => {var img = new Image();img.onload = function(){resolve(img);}img.src = '图片的路径';});return p;}//延时函数,用于给请求计时function timeout(){var p = new Promise((resolve, reject) => {setTimeout(() => {reject('图片请求超时');}, 5000);});return p;}Promise.race([requestImg(), timeout()]).then((data) =>{console.log(data);}).catch((err) => {console.log(err);});

requestImg函数会异步请求一张图片,我把地址写为"图片的路径",所以肯定是无法成功请求到的。timeout函数是一个延时5秒的异步操作。我们把这两个返回Promise对象的函数放进race,于是他俩就会赛跑,如果5秒之内图片请求成功了,那么遍进入then方法,执行正常的流程。如果5秒钟图片还未成功返回,那么timeout就跑赢了,则进入catch,报出“图片请求超时”的信息。运行结果如下:

1.Promise 有几种状态?
3种。
 pending(等待态)

 fulfiled(成功态)

 rejected(失败态)


2.Promise得状态是否可变
不可变


3.Promise如何解决地狱回调?
地狱回调:发送多个异步请求时,每个请求之间相互都有关联,会出现第一个请求成功后再做下一个请求的情况。我们往往会用嵌套的方式来解决这种情况,这就形成了回调地狱。
then里面可以return Promise,来防止地狱回调


4.Promise有哪些方法?他们的应用场景是什么?(all/race)
Promise.all()接收一个对象数组为参数,处理并进行异步操作,如果成功就返回一个数组,失败就返回数据,一旦失败就不会继续往下走
Promise.race()成功返回一个数组,就返回那个成功的数组,不管结果本身是成功还是失败


5.如何让Promise顺序执行(async/await)
async用于函数声明,表示声明的函数为异步函数,这个函数返回一个Promise对象(resolve)
await表示在这里等待promise返回结果
async function getData(){
         await promise1.then(v => console.log(v))
}

原文链接:https://blog.csdn.net/weixin_42451032/article/details/115647237 


原文链接:https://juejin.cn/post/6844903607968481287

http://www.laogonggong.com/news/68193.html

相关文章:

  • 快速做网站费用动态电子商务网站 制作
  • 北京有做网站的吗个人做负面网站犯法不
  • 做群头像的网站在线备案网站需要多久
  • 安庆网站开发网站服务器建设软件
  • 网站登录页面怎么做评论给网站带来的益处
  • 商务网站的可行性分析包括wordpress 积分兑换
  • google网站排名查询网站建设与管理专业好吗
  • 长沙网站设计公司排名网络服务类型及其所采用的网络协议
  • 企业电子商务网站建设规划厦门网站建设公司名单
  • 汽车电子商务网站建设足球比赛直播哪里看
  • 谈谈如何建设企业人力资源网站常州市城市建设局网站
  • 京推推cms网站建设wordpress alt 空
  • 资源交易网站代码wordpress 众筹模板
  • 霸州做网站1766534168西安网约车驾驶员资格证网上报名
  • 广东建网站的公司建材网站建设 南宁
  • 建设外贸网站哪家好仓库管理系统软件
  • 山西省财政厅网站三基建设专栏赣州人才网招聘官网最新招聘
  • 岳阳网站开发服务网站精简布局
  • 公司网站设计主页部分怎么做wordpress页脚菜单
  • 龙岩做网站开发哪家公司好黄冈seo推广软件的更新版本
  • 国内 设计网站的公司wordpress 网站播放器插件下载
  • 龙江手机网站建设亚马逊周末可以视频认证吗
  • 通州区网站建设wordpress header.php
  • 自己做的网站在浏览器上显示不安全wordpress翻译软件
  • 国家企业官方网站查询系统青岛建设项目
  • 网站网页怎么做wordpress api插件
  • 苏州高端网站开发山东网站营销优化开发
  • 怎么在电脑上自己做网站条形码生成器在线制作二维码
  • 博达 网站群建设百度seo查询系统
  • 网站到首页排名培训机构查询网