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

网友投稿 236 2023-05-16


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

前言

异步操作是 javascript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。

从最早的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。

异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用关心它是不是异步。

async 函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。下面就来看看关于async函数的两个栗子:

栗子一:从豆瓣 API 获取数据

var fetchDoubanPCYsTfmIApi = function() {

return new Promise((resolve, reject) => {

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {

if PCYsTfmI(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() {

PCYsTfmItry {

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('=== 获取海报完成 ===');

})();

总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详解axios在vue中的简单配置与使用
下一篇:详解Vue用axios发送post请求自动set cookie
相关文章

 发表评论

暂时没有评论,来抢沙发吧~