js----解决异步之Generator && async
Generator-------生成器函数,解决异步:
generator函数使用: 1、分段执行,可以暂停 2、可以控制阶段和每个阶段的返回值 3、可以知道是否执行到结尾
generator和异步控制:
利用关键字yield,可以把异步操作写在yield语句里面,
每调用一次next方法,则执行一次yield语句
如果有return,return完成之后就退出了生成器函数,后面如果还有yield操作,则不再执行
所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
function* g() { var o = 1; yield o++; yield o++; } var gen = g(); console.log(gen.next()); // Object {value: 1, done: false} var xxx = g(); console.log(gen.next()); // Object {value: 2, done: false} console.log(xxx.next()); // Object {value: 1, done: false} console.log(gen.next()); // Object {value: undefined, done: true}
async和异步:-------------通过await解决异步
用法: async 表示这是一个async函数,await只能用在这个函数里面。 await 表示在这里等待异步操作返回结果,再继续执行。 await 后一般是一个promise对象 示例:async用于定义一个异步函数,该函数返回一个Promise。 如果async函数返回的是一个同步的值,这个值将被包装成一个理解resolve的Promise,等同于return Promise.resolve(value)。 await用于一个异步操作之前,表示要“等待”这个异步操作的返回值。await也可以用于一个同步的值。
let timer = async function timer(){ return new Promise((resolve,reject) => { setTimeout(() => { resolve('500'); },500); }); } timer().then(result => { console.log(result); //500 }).catch(err => { console.log(err.message); });
------------------------------------------------------------------------------------------------------- //返回一个同步的值 let sayHi = async function sayHi(){ let hi = await 'hello world'; return hi; //等同于return Promise.resolve(hi); } sayHi().then(result => { console.log(result);//hello word });