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 相关文章推荐
javascript multibox 全选
Mar 22 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
Nov 24 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
Jquery实现鼠标移动放大图片功能实例
Mar 25 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
Javascript中String的常用方法实例分析
Jun 13 Javascript
AngularJS基础 ng-disabled 指令详解及简单示例
Aug 01 Javascript
Angularjs修改密码的实例代码
May 26 Javascript
DVA框架统一处理所有页面的loading状态
Aug 25 Javascript
webpack本地开发环境无法用IP访问的解决方法
Mar 20 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
Jun 29 Javascript
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
利用php绘制饼状图的实现代码
2013/06/07 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
网页常用特效代码整理
2006/06/23 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
Seajs的学习笔记
2014/03/04 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python实现人脸识别代码
2017/11/08 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
python中的插值 scipy-interp的实现代码
2018/07/23 Python
简单介绍django提供的加密算法
2019/12/18 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
Python中的__init__作用是什么
2020/06/09 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
酒吧副总经理岗位职责
2013/12/10 职场文书
法制宣传月活动方案
2014/05/11 职场文书
白酒营销策划方案
2014/08/17 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
教师党员学习群众路线心得体会
2014/11/04 职场文书
党员检讨书范文
2014/12/27 职场文书
2015年学生会工作总结范文
2015/03/31 职场文书
听课评课活动心得体会
2016/01/15 职场文书