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实现的动态文字变换
Jul 28 Javascript
[推荐]javascript 面向对象技术基础教程
Mar 03 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
Jun 27 Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 Javascript
javascript生成随机大小写字母的方法
Feb 20 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
Oct 08 Javascript
JavaScript实现滑动导航栏效果
Aug 30 Javascript
Vue集成Iframe页面的方法示例
Dec 12 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
微信小程序实现点击空白隐藏的方法示例
Aug 13 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 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
ajax缓存问题解决途径
2006/12/06 PHP
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
浅谈discuz密码加密的方式
2014/05/22 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
php显示页码分页类的封装
2017/06/08 PHP
php的常量和变量实例详解
2017/06/27 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
Javascript实现时间倒计时功能
2018/11/17 Javascript
详解微信UnionID作用
2019/05/15 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
2020/08/15 Javascript
Python中operator模块的操作符使用示例总结
2016/06/28 Python
python 文件操作删除某行的实例
2017/09/04 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
通过实例了解python property属性
2019/11/01 Python
虚拟机下载python是否需要联网
2020/07/27 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
《纸船和风筝》教学反思
2014/02/15 职场文书
《放小鸟》教学反思
2014/04/20 职场文书
中等生评语大全
2014/05/04 职场文书
安全责任书怎么写
2014/07/28 职场文书
学校领导四风问题整改措施思想汇报
2014/10/09 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript