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


Posted in Javascript onMay 11, 2017

前言

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

总结

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

Javascript 相关文章推荐
封装了一个js图片轮换效果的函数
Sep 28 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
Jul 26 Javascript
深入领悟JavaScript中的面向对象
Nov 18 Javascript
JS取得绝对路径的实现代码
Jan 16 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
May 27 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
Jul 08 Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
vue里面父组件修改子组件样式的方法
Feb 03 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
Node.js安装配置图文教程
May 10 #Javascript
使用bootstrap插件实现模态框效果
May 10 #Javascript
详解Vue用axios发送post请求自动set cookie
May 10 #Javascript
Node.js 异步异常的处理与domain模块解析
May 10 #Javascript
基于Node的React图片上传组件实现实例代码
May 10 #Javascript
JavaScript使用ZeroClipboard操作剪切板
May 10 #Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 #Javascript
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
2015/11/26 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
vue 实现input表单元素的disabled示例
2019/10/28 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
通过shell+python实现企业微信预警
2019/03/07 Python
django 中QuerySet特性功能详解
2019/07/25 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
两道JAVA笔试题
2016/09/14 面试题
媒体宣传策划方案
2014/05/25 职场文书
社区元宵节活动总结
2015/02/06 职场文书
高三英语教学反思
2016/03/03 职场文书
JS实现简单九宫格抽奖
2022/06/28 Javascript