generator和async

您所在的位置:网站首页 async意思 generator和async

generator和async

#generator和async| 来源: 网络整理| 查看: 265

1. generator generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数(但并不是一个函数),但可以返回多次; generator由function定义(注意多出的号),并且,除了return语句,还可以用yield返回多次; next()方法会执行generator的代码,然后,每次遇到yield 语句;就返回一个对象{value: x, done: true/false},然后“暂停”。返回的value就是yield的返回值,done表示这个generator是否已经执行结束了。如果done为true,则value就是return的返回值; // 生成器的声明 function* gen() { console.log('abc'); console.log('1'); console.log('2'); console.log('3'); // 礼让 => 异步 let res = yield 'Green'; //下面打印的res就是yield返回的'Green' console.log('444', res) // 444 Green console.log('555') } // 获取生成器对象 let generator = gen(); let res = generator.next(); console.log(res); // {value: 'Green', done: false} generator.next(res.value); 复制代码 2. async-await(ES2017) async-await是ES2017(ES8)提出的基于Promise的解决异步的最终方案,现在更为常用; async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。 await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待; await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行; 如果不是Promise对象:把这个非promise的东西当做await表达式的结果; // 看似同步代码 async function asyncFn() { console.log('3'); // await可以控制异步 let res = await new Promise(res => { console.log('5'); res('数据abc'); }) // 不调用res('数据abc'); 则不执行后续代码 // 等同于.then里面的代码 console.log('4', res); // 也就是说不调用res('数据abc'),本句打印代码不会执行 } // 同步优先 console.log('1') asyncFn(); 复制代码 2.1 async-await应用--处理没有try的reject异常

原理是参数错误优先规则,自定义一个pretty函数来对promise对象进行预处理

function pretty(promise) { // 中间层处理 , 参数错误优先 return promise.then(res => { return [undefined, res]; })// 处理过以后fulfilled .catch(err => { return [err, undefined]; })// 处理过以后fulfilled } 复制代码

使用场景,处理没有try的reject异常

const { log: l } = console; function req() { // 去解决,拒绝 return new Promise((resolve, reject) => { setTimeout(() => { // 数据回来了 let data = Math.random(); if (data 也可以使用以下方法处理没有try的reject异常 window.addEventListener('unhandledrejection', (err) => { err.preventDefault(); // reject(参数) console.log(err.reason, '错误了'); }); 复制代码 3. async-await在forEach循环里的应用

使用场景,想要实现每隔1s调用一次函数fn

let arr = [1, 2, 3, 4, { name: 'Green', fn() { } }] const { log: l } = console; function req(n) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(n); }, 1000); }) } arr.forEach(async (ele, index, newArr) => { await req(ele); console.log('响应了...', ele, newArr) }) 复制代码

结果只等待1s就全部响应完毕

重写forEach进行优化

// 覆盖forEach方法 Array.prototype.forEach = async function (fn) { // 健壮性判断 if (typeof fn !== 'function') throw new Error('必须传递函数'); // 判断this是数组 if (!Array.isArray(this)) throw new Error('this必须是一个数组'); for (let i = 0, len = this.length; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3