async await promise
async 异步函数,以后可能会用得很广。
1、箭头函数: 没有{ }时不写return 也有返回值
2、Promise : 异步神器,很多异步api都是基于Promise
3、new Promise().then().then().catch() :第一个then触发条件:是 Promise() 实例化时resolve()触发, 第二个及以后的then() 触发条件是前一个then() 执行完成,并且将return值作为下一个then的参数。
4、async: 异步函数
5、await : 后面必须跟Promise对象,若非Promise,则不会拦截后面代码执行。当promise对象resolve过后并且执行完then里面的代码,就执行下一步代码,不resolve不会触发下一行代码执行。
需注意:如果then()中需要异步操作,不会等then中的异步执行完过后再执行下一个then()的函数。原因就是,异步函数中,没有地方给你return给then()回调函数。解决方案是async函数。
也就是说Promise对于异步的帮助 其实很有限,.then()只有第一个有用而已。
const aa = _ => new Promise((res, rej) => { // 设置aa函数返回promise对象
setTimeout(function() {
console.log('1')
res('2')
}, 1000);
})
let bb = async function() {
await aa().then((res) => { // await会等待aa()执行完,并且then代码也执行完,当然,then代码里面的异步操作不会执行。
console.log(res)
setTimeout(function(){
console.log('4') // then中的代码执行完直接进入下一个then,这个then 其实return了undifined
return 'sdf'
}, 2000)
}).then(res => {
console.log(res) // undifined
})
console.log('3')
}
console.log(bb()) // Promise {<pending>}
// console 结果 :
Promise { <pending> }
1
2
undifined
3
4
目标:当A异步任务完成后,继续并发n个B异步任务,使用asnyc函数实现
这儿具体是读文件夹,读完后读文件夹中的所有文件。
const readdir = function (path) { // 读文件函数
return new Promise((res, rej) => {
fs.readdir(path, (err, files) => {
if(err) res(err)
res(files)
})
})
}
const stat = function (path) { // 确认是否是文件夹
return new Promise((res, rej) => {
fs.stat(path, (err, file) => {
if(err) res(err)
file.isDirectory() ? res('dir') :res('file') // 返回类型结果
})
})
}
const getdirs = async function(ctx) {
let sendFiles = []
const files = await readdir(filePath) // 读文件夹
const promises = files.map(function(file){ // 利用map函数特性,返回值组成新的数组,这儿并没有用async函数,map内并不等待一个stat回来后再进行另一个stat,是同时进行的。
return stat(filePath + '/' + file)
.then(res => {
if(res === 'dir') sendFiles.push(file)
})
})
await Promise.all(promises) // 这儿是异步并发的关键,在这个位置等待所有promise对象resolve。
ctx.body = sendFiles
}
async await promise的更多相关文章
- 理解koa2 之 async + await + promise
koa是下一代的Node.js web框架. 我们首先使用koa来实现一个简单的hello world吧!假如目前的项目结构如下: ### 目录结构如下: koa-demo1 # 工程名 | |--- ...
- async await promise 执行时序
先用一个例子来说明async await promise的执行顺序 console.log('start'); async function test(){ console.log('111'); a ...
- Async/await promise实现
An async function can contain an await expression that pauses the execution of the async function an ...
- 8张图让你一步步看清 async/await 和 promise 的执行顺序
摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...
- 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)
https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...
- webpack & async await
webpack & async await ES 7 // async function f() { // return 1; // } const f = async () => { ...
- ES6入门十一:Generator生成器、async+await、Promisify
生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...
- async包 ES6 async/await的区别
最基本的async 包 ApCollection.find({}).toArray(function (err, aps) { var num = 0; async.whilst( function ...
- async/await与promise(nodejs中的异步操作问题)
此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...
随机推荐
- Python3使用PyQt5制作简单的画板/手写板
0.目录 1.前言 2.简单的画板1.0 在定点和移动中的鼠标所在处画一条线 3.简单的画板2.0 在定点和移动中的鼠标所在处画一条线 并将画过的线都保留在窗体上 4.简单的画板3.0 将按住鼠标后移 ...
- python项目依赖管理分享迁移后重建开发环境(一)virtualenv 和 pip
作者:Panda Fang 出处:http://www.cnblogs.com/lonkiss/p/rebuild-development-environment-with-virtualenv-an ...
- Spring任务调度之SpringTask基于XML和基于注解的使用示例
使用Spring的环境要求是:JDK1.8以上.Maven3.0以上. Maven依赖 SpringTask集成在SpringContext中,所以只需要SpringContext即可. 可以使用ma ...
- window.open()被拦截问题
最近做项目的时候遇到一个需求,在商品详情页面中点击购买按钮,之后再新标签页中打开生成的订单页面,所以想用window.open()来实现.但是测试的时候发现打开的链接被浏览器拦截. 之后,开始在网上查 ...
- 安装cuda8.0中所遇到的问题-解决办法
正是申请季高峰,但还是被老师抓着干活.之前一直以为cuda已经装好,才知道是骗自己的.我的显卡是640,ubuntu14.4, 比较low. 我是按照这个教程走的,http://m.blog.csdn ...
- keeplived日志位置指定
作为一个运维DBA,除了关心数据库的关键指数.还得往架构和底层基础知识多靠拢. 2010年刚工作的时候,那会Cacti监控比較流行吧.可恶的是SNMP会把默认日志写到系统日志文件中面,导致排错时非常受 ...
- Spring之AOP实现面向切面编程
近期在学Java的动态代理和Spring面向切面编程,越来越认为Spring设计的真的是太完美了.于是,想一个最简单的样例来跑一下.但问题多多,显示缺少,Aspectj里面的相应的类.导入Aspect ...
- 移动浏览器H5页面通过scheme打开本地应用
在移动端浏览器H5页面中,点击按钮打开本地应用主要通过 scheme 协议.本文主要介绍如何在浏览器H5页面中通过 scheme 协议打开本地应用. scheme协议定义 scheme 是一种页面之间 ...
- 大数据学习(8)Hive基础
什么是Hive Hive是一个基于HDFS的查询引擎.我们日常中的需求如果都自己去写MapReduce来实现的话会很费劲的,Hive把日常用到的MapReduce功能,比如排序.分组等功能进行了抽象, ...
- C#相关知识总结
字符串相关知识 判断某字符串中包含某个字符,并过滤 if (string.Contains("*")) string = string.Replace('*',' '); // ...