Generator 函数
- 在function后面,函数名之前有个 * 号。
- 函数内部有yield表达式。
- 其中 * 用来表示函数为 Generator 函数,yield 用来定义函数内部的状态。
function* func(){
console.log("one");
yield '1';
console.log("two");
yield '2';
console.log("three");
return '3';
}
let f=function();
f.next();
// one
// {value: "1", done: false}
f.next();
// two
// {value: "2", done: false}
f.next();
// three
// {value: "3", done: true}
f.next();
// {value: undefined, done: true}
next() 调用
一般情况下,next 方法不传入参数的时候,yield 表达式的返回值是 undefined 当 next 传入参数的时候,该参数会作为上一步yield的返回值。
function* func(){
console.log("one");
yield '1';
console.log("two");
yield '2';
}
let f=function();
f.next();
// one
// {value: "1", done: false}
f.next();
// two
// {value: "2", done: false}
f.next();
// {value: undefined, done: true}
done 表示函数是否执行完, true表示执行完了 false表示未执行完。
return方法
- return 方法返回给定值,并结束遍历 Generator 函数。
- return 方法提供参数时,返回该参数;不提供参数时,返回 undefined 。
function* func(){
console.log("one");
var a= yield 1 ;
console.log("two");
var b= yield 2 ;
console.log("three");
// return 99;
console.log("three");
yield 3;
console.log("four");
return 4;
}
let f=function();
clonsole.log(f.next());
clonsole.log(f.next(10));
f.return(88);
clonsole.log(f.next(20));
clonsole.log(f.next());
ES6 async 函数
- async 是 ES7 才有的与异步操作有关的关键字,和 Promise , Generator 有很大关联的。
语法
async function name([param[, param[, ... param]]]) { statements }
- name: 函数名称。
- param: 要传递给函数的参数的名称。
- statements: 函数体语句。
async function func(){
return "调用一下我";
}
console.log(func())
func().then(v=>{
console.log(v);
})
promise方法
var abc = new Promise(function(resolve,reject){
resolve("调用我");
})
abc.zhen((v)=>{
console.log(v);
})
console.log(abc);
- async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。
- await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误。
- Promise 对象:await 会暂停执行,等待 Promise 对象 resolve,然后恢复 async 函数的执行并返回解析值。
- 非 Promise 对象:直接返回对应的值。
function testAwait () {
return new Promise(resolve => {
setTimeout(() => {
resolve(111);
}, 1000);
});
return setTimeout(() => {
console.log(222);
}, 1000);
}
async function helloAsync() {
await testAwait ();
console.log(333);
}
helloAsync ();