js异步编程

方式一:Promise

promise

Js中进行异步编程的新的解决方案(传统的解决方案——回调函数和事件),用于表示一个异步操作的最终完成 (或失败), 及其结果值.。

promise 有三种状态

Pending(进行中,初始状态,既不是成功,也不是失败状态。)、Resolved(已完成,又称 Fulfilled)、Rejected(已失败)

这三种状态的变化途径只有2种: 异步操作从 未完成 pending => 已完成 resolved 异步操作从 未完成 pending =>
失败 rejected 状态一旦改变,就无法再次改变状态,这也是它名字 promise-承诺 的由来,一个promise对象只能改变一次

promise解决地狱回调(能够保证接口按顺序调用)

// 先输出A, 再输出B

	searchData() {
	      this.getA()
	        .then( res => {
	          this.getB()
	        })
	    },
	getA() {
	      return new Promise((resolve, reject) => {
	        getAIPA()
	          .then( res => {
	          console.log('A')
	            resolve(res)
	          })
	          .catch( err => {
	            reject(err)
	          })
	      })
	    },
    getA() {
      return new Promise((resolve, reject) => {
        getBIPA()
          .then( res => {
          console.log('B')
            resolve(res)
          })
          .catch( err => {
            reject(err)
          })
      })
    },

Promise.all() ----every()

1.当所有promise对象状态都是成功状态才返回结果,只要其中有一个的对象是reject的,就返回reject的状态值。
2.promise.all中的子任务是并发执行的,适用于前后没有依赖关系的。
3.输出结果是按照promise对象的先后顺序输出的
4.适用场景:比如当一个页面需要在很多个模块的数据都返回回来时才正常显示,否则loading。

在这里插入图片描述

在这里插入代码片
```## 标题

```bash
let p1 = Promise.resolve(123);
let p2 = Promise.resolve('hello');
let p3 = Promise.resolve('success');


Promise.all([p1,p2,p3]).then(result => {
    console.log(result);
})

结果:
[ 123, ‘hello’, ‘success’ ]

Promise.race----(some())

1.Promise.race()意为赛跑的意思,也就是数组中的任务哪个获取的块,就返回哪个,不管结果本身是成功还是失败。
2.一般用于和定时器绑定,比如将一个请求和三秒的定时器包装成Promise实例,加入到Promise队列中,请求三秒中还没有回应时,给用户一些提示或相应的操作。

	let p1=new Promise((resolve,reject)=>{
	    setTimeout(()=>{
	            resolve('success');
	        }, 10000);
	});
	
	let p2=new Promise((resolve,reject)=>{
	    setTimeout(()=>{
	        reject('faild');
	    }, 500);
	});
	
	Promise.race([p1,p2]).then(res=>{
	    console.log(res);  
	}).catch(err=>{
	    console.log(err); // 返回的是faild
	})

方式二:async和await

async用于申明一个function是异步的,而await可以认为是async wait的简写,等待一个异步方法执行完成。
async-await寄生与Promise

在这里插入图片描述

在这里插入图片描述

  • Demo
 created() {
    this.getTableList()
  },
  methods: {
    async getTableList() {
      this.jobTypes = await this.getData()
      this.jobRecordsByPage(this.onlyMyLog)
    },
	getData() {
	     return new Promise((resolve, reject) => {
	       // 加载工作类型
	       getDict({ key: 'jobType' })
	         .then(res => {
	           if (res.code === 0) {
	             resolve(res.data.values)
	           }
	         })
	         .catch(() => {
	           reject()
	         })
	     })
	   },
  }
 

async和await的异常捕获

一般我们会想到用 try/catch和then().catch()

//方法1: try / catch
async fn() {
    try {
        const res = await getData();
        console.log(res)
    } catch {
        console.log(err)
    }
}

// 方法2: then().catch()
async fn() {
    const res = await getData()
                .then(res => {
                    console.log(res)
                })
                .catch(err => {
                    console.log(err)
                })
}

// 一般选择用如果有多个请求,则需要重复写try/catch,冗余代码,因此可以封装
test(fn) {
    return new Promise(async resovle => {
        try {
            let res = await fn;
            resolve([null, res]); // 对应【err, res】
        } catch(err) {
            resolve([err, null])
        }
    })
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值