首页 > 编程 > JavaScript > 正文

es6学习笔记之Async函数的使用示例

2019-11-19 16:36:55
字体:
来源:转载
供稿:网友

前言

异步操作是 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('=== 获取海报完成 ===');})();

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对武林网的支持。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表