fs项目---->async/await的学习(一)
2018-07-11号,我来到了fs项目组担任后端开发的角色。这是我来thoughtworks以来首个的正式项目,不管是在技术还是在敏捷的实践中都是受益匪浅。来感受tw特殊的文化的同时,我希望自己能够学到更多的东西。不忘初心,坚持总结。这篇博客主要记载的是async/await在Array中使用遇到的一些问题。
一、async/await在Array.forEach中不work
我们想在forEach中执行操作再执行下面的操作,但是运行并没有生效。下面看一下forEach的事例
const waitFor = (ms) => new Promise(r => setTimeout(r, ms));
const start = async () => {
const array = [, , ];
array.forEach(async (item) => {
await waitFor(item);
console.log(item);
});
console.log('done');
}
start();
在nodejs(v10.6.0)中运行,可以看到如下的结果
done
原因的分析可以参考一下forEach的实现,这里暂时不做说明:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill。下面提供两种提供的方案
- 不使用forEach,使用fori的循环,同步执行
const start = async () => {
const array = [, , ];
for (let i = ; i < array.length; i++) {
await waitFor(array[i]);
console.log(array[i]);
}
console.log('done');
}
- 使用Promise.all和map的实现,异步执行
const start = async () => {
const array = [, , ];
await Promise.all(array.map(async num => {
await waitFor(num);
console.log(num);
}));
console.log('done');
}
最终得到我们想要的运行结果
done
二、async/await在Array.filter中不work
我们写一个js的例子,nodejs的版本是v10.6.0。代码如下
const filterOperate = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = array.filter(async (item) => {
await filterOperate(item);
return item === ;
});
console.log(array);
console.log('done');
}
start();
运行的结果并不是我们想要的,如下:
[ , , ]
done
我们需要改进filter,用我们定义的asyncFilter方法。定义如下:
const filterOperate = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const asyncFilter = async (arr, callback) => {
const fail = Symbol();
return (await Promise.all(arr.map(async item => (await callback(item)) ? item : fail))).filter(i => i !== fail);
};
const start = async () => {
let array = [, , ];
array = await asyncFilter(array, async (item) => {
await filterOperate(item);
return item == ;
})
console.log(array);
console.log('done');
}
start();
打印的结果如下:
[ ]
done
三、async/await在Array.map中不work
我们写一个js的例子,代码如下:
const promise = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = await array.map(async (item) => {
await promise(item);
return item * ;
})
console.log(array);
console.log('done');
}
start();
运行的结果如下:
[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
done
我们改进代码,使它返回正确的结果。只要在外面包含一层Promise.all就可以。如下
const promise = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const start = async () => {
let array = [, , ];
array = await Promise.all(array.map(async item => {
await promise(item);
return item * ;
}));
console.log(array);
console.log('done');
}
start();
运行的结果如下:
[ , , ]
done
友情链接
fs项目---->async/await的学习(一)的更多相关文章
- fs项目---->cron框架的学习(一)
Cron是一种允许您按计划执行某些内容的工具.这通常使用cron语法来完成.我们允许您在计划作业触发时执行函数.我们还允许您使用子进程执行javascript进程外部的作业.此外,这个库超出了基本的c ...
- javascript异步编程 Async/await
Async/await Async/await 在学习他之前应当补充一定的 promise 知识 它是一种与 promise 相配合的特殊语法,目前被认为是异步编程的终级解决方案 值得我们每一个人学习 ...
- vue项目进行时,script标签中,methods事件中函数使用的async/await
用 async/await 来处理异步 await关键字只能放到async函数里面,通过await得到就是Promise返回的内容:当然也能通过then()去获取,若通过then()获取了则就无Pro ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- .NET异步操作学习之一:Async/Await中异常的处理
以前的异常处理,习惯了过程式的把出现的异常全部捕捉一遍,然后再进行处理.Async/Await关键字出来之后的确简化了异步编程,但也带来了一些问题.接下来自己将对这对关键字进行学习.然后把研究结果放在 ...
- (译文)学习ES6非常棒的特性——Async / Await函数
try/catch 在使用Async/Await前,我们可能这样写: const main = (paramsA, paramsB, paramsC, done) => { funcA(para ...
- 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用
github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...
- Async/Await 学习与示例
参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...
- JavaScript基础——深入学习async/await
本文由云+社区发表 本篇文章,小编将和大家一起学习异步编程的未来--async/await,它会打破你对上篇文章Promise的认知,竟然异步代码还能这么写! 但是别太得意,你需要深入理解Promis ...
随机推荐
- kubeadm安装kubernetes V1.11.1 集群
之前测试了离线环境下使用二进制方法安装配置Kubernetes集群的方法,安装的过程中听说 kubeadm 安装配置集群更加方便,因此试着折腾了一下.安装过程中,也有一些坑,相对来说操作上要比二进制方 ...
- 17、python对内存的使用
python对内存的使用 浅拷贝和深拷贝 所谓浅拷贝就是对引用的拷贝(只拷贝父对象) 所谓深拷贝就是对对象的资源的拷贝 解释一个例子: import copy a = [1,2,3,['a','b', ...
- [Canvas]Bombman v1.04
Bombman是我仿造红白机上经典游戏爆破小人,用Canvas制作的一款网页版单机游戏, 自我感觉还是有一定的可玩性. 本游戏的胜利条件是用雷消灭所有怪物,但被怪物即使是擦边碰到或是炸弹火焰炸到就算失 ...
- SQL2012 之 创建备份计划
打开数据库,选择 管理 → 右键维护计划→选择新建维护计划,填写计划名称,如下图: 修改维护计划参数,如下图: 工具箱->备份数据库任务,拖到计划里,如下图: 编辑“备份数据库”任务,如下图: ...
- CentOS 7不能进入图形界面
开机后发现CentOS 7不能进入图形界面,进入终端模式后运行startx命令也报错,不知道什么原因,后来运行了yum upgrade命令,升级以后就可以进入图形界面了,同时也升级了.
- addEventListener 第三个参数
addEventListener api target.addEventListener(type, listener[, options]); target.addEventListener(typ ...
- 使用LinkedHashMap来实现一个使用LRU(Least Recently Used)算法的cache
removeEldestEntry在使用put或者putAll方法插入一个新的entry到map中时被调用,是否要删除年老的entry取决于是否满足既定的条件(比如本例中的条件:MAP中entry数量 ...
- ios实例开发精品源码文章推荐(8.28)
iOS源码:游戏引擎-推箱子游戏 <ignore_js_op> http://www.apkbus.com/android-106392-1-11.html iOS源码:进度条-Color ...
- 如何在 Github 上发现优秀的开源项目?
之前发过一系列有关 GitHub 的文章,有同学问了,GitHub 我大概了解了,Git 也差不多会使用了,但是还是搞不清 GitHub 如何帮助我的工作,怎么提升我的工作效率? 问到点子上了,Git ...
- device eth0 does not seem to be present, delaying initialization(转)
vmlite虚拟机启动出错,就把这个虚拟机删除掉重新建立,系统虚拟硬盘使用之前的,启动系统后不能上网,通过ifconfig查看网卡没启动,遂启动网卡服务,但是出错,就是:device eth0 doe ...