时间:2022-09-03 10:13:26 | 栏目:vue | 点击:次
简介:
promise
是什么,它可以说是异步编程的一种解决方法,就拿传统的ajax发请求来说,单个还好,如果是一个请求回来的数据还要被其他请求调用,不断地嵌套,可想而知,代码看起来是很乱的,promise主要是为了解决这种情景而出现的。
promise
对象,通过new Promise().then()
执行下一步骤操作。axios is a promise based HTTP client for the browser and node.js
。也就是说,使用axios发出请求,难免涉及promise。Promise
构造函数的参数是一个函数,函数里面的代码是异步的,即Promise
里面的操作,和Promise()
外面的操作时异步"同时"进行的。Promise中的函数的第一个参数是回调函数,resolve
用来触发then里面的代码,第二个参数是回调函数,reject用来触发catch中的代码,throw new Error()
;也可以触发catch,
resolve和reject是两个回调函数,调用resolve会触发then,reject会触发catch:
<script> new Promise((resolve, reject) =>{ setTimeout(() =>{ //成功的时候调用resolve resolve('成功data') //失败的时候调用reject reject('error message') }, 1000) }).then((data) =>{ //处理成功后的逻辑 console.log(data);//这个data 是接收的resolve参数-- }).catch((err) =>{ console.log(err); }) </script>
promise
链中,只要任何一个promise被reject
,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch
方法。p1().then(p2).then(p3) .then(function(data) { console.log('data: ' + data); }) .catch(function(error) { console.log('error: ' + error); }); function p1() { return new Promise(function(resolve, reject) { console.log('p1 resolved'); resolve(123); }); } function p2() { return new Promise(function(resolve, reject) { console.log('p2 rejected'); reject(456); }); } function p3() { return new Promise(function(resolve, reject) { console.log('p3 resolved'); resolve(789); }); }// 执行结果p1 resolvedp2 rejectederror: 456
Promise
构造函数的参数是一个函数,函数里面的代码是异步的,即Promise
里面的操作,和Promise()
外面的操作时异步"同时"进行的。此外,只要在函数前面加上async 关键字,也可以指明函数是异步的。
async关键字实际是通过Promise
实现,如果async 函数中有返回一个值 ,当调用该函数时,内部会调用Promise.solve()
方法把它转化成一个promise 对象作为返回,但如果timeout 函数内部抛出错误,那么就会调用Promise.reject()
返回一个promise 对象。若某函数调用一个异步函数(比如内部含有primise),该函数应用async修饰。
await表示“等待”,修饰返回promise 对象的表达式。注意await 关键字只能放到async 函数里面。
function doubleAfter2seconds(num) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(2 * num) }, 2000); } ) }//写一个async 函数,从而可以使用await 关键字, await 后面放置的就是返回promise对象的一个表达式,所以它后面可以写上 doubleAfter2seconds 函数的调用 async function testResult() { let result = await doubleAfter2seconds(30); console.log(result); }
await 等待后面的promise
对象执行完毕,然后拿到promise resolve
的值并进行返回。显然await可以修饰axios请求,等待得到结果再往下进行,如:
async getUserList(){ const {data: res} = await this.$http.get('users', { params: this.queryInfo }) //console.log(res) if (res.meta.status !== 200) return this.$message.error('获取用户列表失败! ') this.userlist = res.data.users this.total = res.data.total }