前端开发Kingcean 2020-07-30
我们先来看Promise的基本语法
setTimeout(function(){ let data = ‘hello‘ console.log(content); },1000)
// 参数 --> 函数 (resolve,reject) new Promise((resolve,reject) => { setTimeout(function(){ resolve(‘hello‘) reject(‘Error Data‘) },1000) }).then(data => {console.log(data); }).catch(error => { console.log(error) }) // 什么情况下使用promise : // 1. 一般情况下使用Promise 对这个异步操作进行封装
首先你会觉得多此一举
new Promise((resolve,reject) => { setTimeout(() => { resolve(‘hello ok‘) reject(‘error no‘) },1000) }).then(data => { console.log(data) },err =>{ console.log(err) })
我们在看Promise的流程图时,发现无论是then 还是catch都可以返回一个Promise对象,所以我们的代码其实是可以进行链式调用的:
这里我们直接通过Promise 包装一下新的数据,将Promise 对象返回
// 链式调用的代码 new Promise((resolve,reject) => { setTimeout(function(){ resolve(‘qzk‘) },1000) }).then(data => { console.log(data); // qzk // 方法一:原生方法 //return new Promise((resolve,) =>{ // resolve( data+‘111‘) //}) // 方法二: //return Promise.resolve(data + ‘111‘) // 方法三:省略掉 Promise.resolve() return data + ‘1111‘ }).then(data => { console.log(data); // qzk111 return Promise.reject(data + ‘error‘) // 或者可以手动抛出异常,给catch捕获 // throw ‘error‘ }).then(data => { console.log(data) // 这里不打印 return Promise.resolve(data + ‘333‘) }).catch(error => { console.log(error) // qzk111error })
需求:一个渲染或其他事件依赖于两个请求(请求1,请求二)
Promise.all([ new Promise((resolve,reject) => { // 伪代码 ajax 发送请求一 $ajax({ url:‘http://127.0.0.1:8000/ajax1/‘ success:function(data){ resolve(data) } }) }), // 伪代码 ajax 发送请求二 $ajax({ url:‘http://127.0.0.1:8000/ajax2/‘ success:function(data){ resolve() } }) ]).then(results => { // 第一个网络请求的结果 console.log(results[0]) // 第二个网络请求的结果 console.log(results[1]) })