原贴链接:javascript异步之resolve()、reject()
我们上次讨论了Promise.all()、Promise.race()、Promise.finally()
今天我们继续讨论Promise的两个常用API
可以这么说,resolve和reject撑起了Promise的半边天,我们平时用的最多的就是这两个API
准备工作
- 上一次我们用axios来实现ajax请求,因为axios也是返回的promise,可能有人会产生误导,这次我们用Jquery来实现ajax请求
- mock配置接口,用来模拟后台接口
resolve()和reject()
我们知道Promise是一个构造函数,用来实例化一个Promise实例,
这个Promise构造函数,用一个函数来作为参数
这个作为参数的函数又有两个参数
第一个参数是resolve
第二个参数是reject
当然这两个参数都不是必填项
Promise有三个状态:等待,成功,失败
异步是一个耗时的过程,当在执行异步的时候,就是Promise的等待过程
当异步函数执行完,
如果异步执行成功,我们就调用resolve,将等待切换到成功
如果异步执行失败,我们就调用reject,将等待切换到失败
(类似于,有个判断,如果成功就执行resolve,如果失败就执行reject,需要我们手动切换)
过程不可逆,失败就是失败,不会再变,反之亦然
我们先看下mock的数据
{"success":true,"data": {"name": "这是接口一的返回值"}}
再来看下我们的代码栗子:
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>promise</title><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script></head><body><script>window.onload = () => {new Promise((resolve, reject) => {$.ajax({url: "https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/promise1",success: ({data,success}) => {if (success) {resolve(data)} else {reject(data)}}});}).then(res => {console.log(res);})}</script></body></html>
Jquery请求后台接口,如果返回的值是成功的,是我们想要的,就把data作为参数传递给resolve,然后就会执行then方法,最后输出
//=>{name: "这是接口一的返回值"}
有几点要声明
resolve, reject是形参,不是必须这么写
如下写法也可以
//省略。。new Promise((aaa, bbb) => {//省略。。if (success) {aaa(data)} else {bbb(data)}//省略。。
关于resolve和reject的参数介绍可以参考《ECMAScript 6 入门》,不再此赘述
使用场景
异步都可以使用Promise进行包装
ajax请求,图片加载
定时器
UI交互(点击事件等)
ajax请求
上面介绍了Promise的ajax请求的实现
图片加载
new Promise((resolve, reject) => {const url ='http://www.qdtalk.com/wp-content/uploads/2018/11/bryan-goff-528709-unsplash-1.jpg'const image = new Image();image.onload = () => {resolve(image);};image.onerror = () => {reject(new Error("图片加载失败"));};//对image添加一些属性image.src = url;image.alt = '这是陌上寒个人博客的banner';}).then(res=>{console.log('图片加载成功,即将返回一个图片dom');console.log(res);//=> <img src="http://www.qdtalk.com/wp-content/uploads/2018/11/bryan-goff-528709-unsplash-1.jpg" alt="这是陌上寒个人博客的banner">})
这个栗子有点“hello world”,有以下场景可能会用到
- 当在处理图片懒加载的时候,
- 图片过大,可能加载失败
- 页面图片过多(页面就是由图片堆起来的)通过图片的加载,来实现加载的进度条。
定时器
我想定时器就没有必要通过Promie包装了,因为它本身就有一个回调函数
setTimeout((a, b) => {console.log(a);//=>第一个参数console.log(b);//=>第二个参数}, 1000, '第一个', '第二个参数');
所以说用Promise包装定时器意义不大
UI交互
我们举一个常用的栗子=>模态框
当我触发某一个动作的时候,会弹出这个模态框,当你点击了确定或者取消都会进行与之相关的操作,我们在这里应用了Promise进行包装
代码如下,重点看js代码
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>promise</title><link rel="stylesheet" href="https://qdtalk.com/weixin/style1229.css"></head><body><button id="myBtn">出现弹窗</button><div class="modal-wap"><header>标题</header><article>这是内容</article><footer><button id="confirm">确定</button><button id="cancel">取消</button></footer></div><script>function dom$(id) {return document.getElementById(id);}function modelFun() {return new Promise((resolve, reject) => {dom$('confirm').onclick = () => {resolve()}dom$('cancel').onclick = () => {reject()}})}dom$('myBtn').onclick = () => {document.querySelector('.modal-wap').style.display = 'block'modelFun().then(() => {console.log('你点击了确定');}, () => {console.log('你点击了取消');}).finally(() => {document.querySelector('.modal-wap').style.display = 'none'})}</script></body></html>
相信你的眼光,这是一个很漂亮的模态框!

点击“出现弹窗”按钮,出现模态框,模态框有两个按钮,取消和确定
我们对这个模态框进行了包装,如果点击了确定就执行resolve,如果点击了取消就执行reject,然后就会执行then方法
then方法,不是我们今天要介绍的内容,简单说:它也有两个参数,一个是resolve,另一个是reject
点了不同的按钮,执行了不同的事件
最后执行finally,不管是点击了取消还是确定,只要状态切换,都会关闭模态框
so easy
以上就是关于resolve和reject的常用内容介绍
