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的更多相关文章

  1. 理解koa2 之 async + await + promise

    koa是下一代的Node.js web框架. 我们首先使用koa来实现一个简单的hello world吧!假如目前的项目结构如下: ### 目录结构如下: koa-demo1 # 工程名 | |--- ...

  2. async await promise 执行时序

    先用一个例子来说明async await promise的执行顺序 console.log('start'); async function test(){ console.log('111'); a ...

  3. Async/await promise实现

    An async function can contain an await expression that pauses the execution of the async function an ...

  4. 8张图让你一步步看清 async/await 和 promise 的执行顺序

    摘要: 面试必问 原文:8张图帮你一步步看清 async/await 和 promise 的执行顺序 作者:ziwei3749 Fundebug经授权转载,版权归原作者所有. 为什么写这篇文章? 说实 ...

  5. 8 张图帮你一步步看清 async/await 和 promise 的执行顺序(转)

    https://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651555491&idx=1&sn=73779f84c289d9 ...

  6. webpack & async await

    webpack & async await ES 7 // async function f() { // return 1; // } const f = async () => { ...

  7. ES6入门十一:Generator生成器、async+await、Promisify

    生成器的基本使用 生成器 + Promise async+await Promise化之Promisify工具方法 一.生成器的基本使用 在介绍生成器的使用之前,可以简单理解生成器实质上生成的就是一个 ...

  8. async包 ES6 async/await的区别

    最基本的async 包 ApCollection.find({}).toArray(function (err, aps) { var num = 0; async.whilst( function ...

  9. async/await与promise(nodejs中的异步操作问题)

    此文只是粗略介绍使用方法,欲了解核心概念请参考官方文档或其他资料. 举例写文章详情页面的时候的一个场景:首先更改文章详情中的 PV,然后读取文章详情,然后根据文章详情中文章 Id 查阅该文章评论和该文 ...

随机推荐

  1. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

  2. Qwtpolar的编译

    Qwtpolar是Qt的一个第三方扩展,用于绘制极坐标下的函数图形.官方网站在: http://sourceforge.net/projects/qwtpolar/ 新版的QGIS2.8依赖这个库,所 ...

  3. vue的组件和生命周期

    Vue里组件的通信 通信:传参.控制.数据共享(A操控B做一个事件) 模式:父子组件间.非父子组件 父组件可以将一条数据传递给子组件,这条数据可以是动态的,父组件的数据更改的时候,子组件接收的也会变化 ...

  4. docker commit使用

    我们运行的容器可能在镜像的基础上做了一些修改,有时候我们希望保存起来,封装成一个更新的镜像 docker自己提供的有commit功能 我们以centos为例,现在我们要在一个裸的centos上面安装v ...

  5. Python学习日记:day5-------dict字典

    #字典dict------->唯一的映射类型 1.数据类型的划分 数据类型划分为可变数据类型和不可变数据类型. 不可变数据类型:tupe(元组).bool.int.str           可 ...

  6. GitLab配置ssh key

    一.背景 当前很多公司都选择git作为代码版本控制工具,然后自己公司搭建私有的gitlab来管理代码,我们在clone代码的时候可以选择http协议,当然我们亦可以选择ssh协议来拉取代码.但是网上很 ...

  7. boost::assign(标准容器填充库)

    boost::assign通过对"+="和","的重载非常方便的填充标准容器(std::vector,std::set,std::list,std::map), ...

  8. Java I/O---概述

    对于程序设计者来说,创建一个好的输入/输出系统(I/O)系统是一项艰难的任务. 现在大量不同方案已经说明了这一点.挑战似乎来自于要涵盖所有的可能性.不仅存在各种I/O源端和想要与之通信的接收端(文件. ...

  9. KVM 初探

    KVM 是业界最为流行的 Hypervisor,全称是 Kernel-based Virtual Machine.它是作为 Linux kernel 中的一个内核模块而存在,模块名为 kvm.ko,也 ...

  10. xamarin android checkbox自定义样式

    xamarin android checkbox自定义样式 在drawable文件在新建checkbox_bg.xml文件 <?xml version="1.0" encod ...