generater函数
一、特点
-
1.generator不是函数(yield只能写在generater中)
-
g()不会立即执行,而是一上来就暂停,并返回一个Iterator对象(返回值为iterator,g1是iterator)
-
每次g1.next()都会打破暂停状态去执行,直到遇到下一个yield或者return
-
遇到yield时,会执行yeild后面的表达式,并返回执行之后的值,然后再次进入暂停状态,此时done: false。
-
遇到return时,会返回值,执行结束,即done: true
二、实例
gettoken(){
}
getusers(){
}
function *g(){
//1.请求token
gettoken();
yield 1;
//2.请求user
getusers();
yield 2;
//请求delete
return 3
}
var g1=g();
g1.next();//多次调用next,向下执行一个状态
g1.next();
async函数
一、特定
- await只能放在async函数中。
- await后面可以是任何对象
- async函数返回的是一个Promise对象
- 如果await后面的Promise状态变为reject,那么会停止整个async函数
二、实例
async function fn(){
//请求token
let token = await gettoken()
// 拿到token
let id = await getusers(token);
// 根据token去拿用户信息.
let other = await delete(id)
// 根据info去拿其他信息
}
fn();// 最后我们再调用这个函数
promise函数
一、特点
- es中没有多线程,但是可以有异步操作;
- promise就是异步编程的解决方案
- promise本身是一个构造函数:
二、创建
var p1=new Promise((resolve,reject)=>{
resolve:函数,当请求成功之后执行
reject:函数,当请求失败时执行
resolve(data);
//执行异步操作
});
三、api
1.非静态方法
then:
实例对象调用
p1.then(success,error);
catch:
捕获异常,不让代码报错抱死
then中的任何一个回调报错都会执行该方法
p.then(function(data){
console.log("success-then:",data);
console.log(nonum);
},function(data){
console.log("error-then:",data);
}).catch(function(reason){
console.log("catch-error--",reason);
});
finally:
无论成功失败都执行该回调
2.静态方法
- all:
all统一执行完三个函数并将成功的值存在一个数组里面返回给then进行回调输出,如有有一个执行为reject-》all的then执行失败回调 - race:
all是等所有的异步操作都执行resolve再执行then方法,那么race方法就是相反的,谁先执行完成就先执行回调。先执行完的不管是进行了race的成功回调还是失败回调,其余的将不会再进入race的任何回调
四、实例
var promise=new Promise((resolve,reject)=>{
console.log("异步请求开始啦-----");
//发送一步请求
var request=new XMLHttpRequest();
request.open("get","http://47.106.244.1:8099/manager/category/findAllCategory");
request.setRequestHeader("Accept",'application/json');
request.send();
request.onreadystatechange=function(){
if(request.readyState == 4){
if(request.status===200){
//console.log(request.response,'-----');
resolve(request.response);
}else{
reject(request.status);
}
}
}
});