其实用的比较晚了这个特性,之前一直是停留在理论阶段,网上的教程又都是用babel-preset-stage-0的--
先说下开发环境吧。我之前一直没有配置成功,最后发现居然是我在全局安装了一个babel的旧版本,想死的心都有--
babel-cli, babel-preset-latest, babel-polyfill,这三个就足够了,用latest简单暴力,里面包含了所有babel最新的ES的preset--
还有,我写的是一个类似爬虫的东东,用习惯了Fetch API,所以我这里在Node.js用的node-fetch,挺好用的--
只要是返回Promise的都可以用await来前置,不是Promise也没关系。前提是,await语句必须包含在async函数里面,好像没人提到。async函数可以用await来调用,酱紫返回的是最后的resolve结果。如果直接调用,也是可以的,毕竟async函数总是要有个入口的嘛,返回的是Promise对象,即使你返回的不是Promise他也会包装下--
例子,我的getJson函数是一个async函数,返回一个网页进行正则匹配后的json。我需要并发多个获取,统一返回所有结果,这里我是这么写的:
let getInfo = async urls => {
return new Promise((res, rej) => {
let count = 0;
let info = [];
for (let i in urls)
{
let ptr = i;
getJson(urls[ptr]).then(obj => {
++count;
info[ptr] = obj;
if (count == urls.length)
res(info);
});
}
});
};
这个getInfo函数也是async函数,因为我后面要用到它,看我的导出接口:
let updateInfo = async () => {
let {urls, year, month, desc} = await getIndex();
let info = await getInfo(urls);
return {desc, year, month, info};
}
//导出接口
export {updateInfo};
getIndex函数也是async函数,抓取了一个网页并进行解析,得到urls数组,然后传给了getInfo,得到了所有页面的解析结果。总的来说,async/await特性还是很有用的,不过暂时还不是官方特性。对了,代码一定要:
import 'babel-polyfill';
不然会解析出错的。babel只是把它转译成ES5或者ES3了,但是相关功能的模拟要靠这个库来实现的。
实践下总是好的,不然总也不会用。现在可以抛弃co模块了,你看看koa2不是也用这个了么--
对了,以上的代码截取自一个新番索引网站,其实就是练练手,抓的dilidili的网站,http://acm.dosk.win:3010/ ,代码在Github能看到--