es6学习笔记之Async函数的使用示例
程序员文章站
2023-01-29 13:35:17
前言
异步操作是 javascript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。
从最早的回调函数,到 promise 对象,再到 gener...
前言
异步操作是 javascript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。
从最早的回调函数,到 promise 对象,再到 generator 函数,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。
异步i/o不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用关心它是不是异步。
async 函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。下面就来看看关于async函数的两个栗子:
栗子一:从豆瓣 api 获取数据
var fetchdoubanapi = function() { return new promise((resolve, reject) => { var xhr = new xmlhttprequest(); xhr.onreadystatechange = function() { if (xhr.readystate === 4) { if (xhr.status >= 200 && xhr.status < 300) { var response; try { response = json.parse(xhr.responsetext); } catch (e) { reject(e); } if (response) { resolve(response, xhr.status, xhr); } } else { reject(xhr); } } }; xhr.open('get', 'https://api.douban.com/v2/user/aisk', true); xhr.setrequestheader("content-type", "text/plain"); xhr.send(data); }); }; (async function() { try { let result = await fetchdoubanapi(); console.log(result); } catch (e) { console.log(e); } })();
栗子二:根据电影文件名,自动下载对应的海报
import fs from 'fs'; import path from 'path'; import request from 'request'; var moviedir = __dirname + '/movies', exts = ['.mkv', '.avi', '.mp4', '.rm', '.rmvb', '.wmv']; // 读取文件列表 var readfiles = function () { return new promise(function (resolve, reject) { fs.readdir(moviedir, function (err, files) { resolve(files.filter((v) => exts.includes(path.parse(v).ext))); }); }); }; // 获取海报 var getposter = function (moviename) { let url = `https://api.douban.com/v2/movie/search?q=${encodeuri(moviename)}`; return new promise(function (resolve, reject) { request({url: url, json: true}, function (error, response, body) { if (error) return reject(error); resolve(body.subjects[0].images.large); }) }); }; // 保存海报 var saveposter = function (moviename, url) { request.get(url).pipe(fs.createwritestream(path.join(moviedir, moviename + '.jpg'))); }; (async () => { let files = await readfiles(); // await只能使用在原生语法 for (var file of files) { let name = path.parse(file).name; console.log(`正在获取【${name}】的海报`); saveposter(name, await getposter(name)); } console.log('=== 获取海报完成 ==='); })();
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。