async函数和await函数的使用

async函数返回值为Promise

await函数放在一个Promise对象前

async函数和awite函数一般结合使用,实现同步语法,获得异步的Promise的结果,是对Promise用法的升级和优化。

// 1, async函数的语法特点
async function add(a,b){
    // return a + b
    return new Promise(function(resolve){
        resolve("abc")
    })
}
console.log(add(2,3))
add(2,3).then(res=>{console.log(res)})
// async函数的返回值总是一个promise对象, 有以下三种情况
// 如果没有写返回值, 则得到一个空的promise对象, resolve数据是undefined,  
// 如果返回值是数据,则得到一个非空的peomise对象, resolve数据是返回的数据,  
// 如果返回值自定义peomise, 则直接得到这个对象

// 2, awite 同步语法
var p = new Promise(function(resolve){
    setTimeout(() => {
        resolve("成功")
    }, 100);
})
// 正常情况下, 一般在promise对象的then方法的回调中拿到结果
p.then(function(res){ console.log(res)} );
// awite 放在一个promise对象前, 会等待promise异步结果,然后以返回值的形式拿到异步结果, 使异步结果更简单方便的获取, 避免了回调的嵌套结构, 省略了then函数调用
// var res = await p
// 为什么awite可以使用同步返回值的形式拿到异步promise的结果?
// 原因: awite通过阻塞进程,使同步代码暂停执行, 等promise异步任务得到结果后,继续执行同步指令,  所以,(await is only valid in async function awite仅允许在异步函数中使用, 他只会阻塞异步函数中的同步代码, 不会阻塞整个进程)
console.log(0)
async function fun(){
    console.log(1)
    var data = await p;
    console.log(2)
    console.log(3,data);
}
fun()
console.log(4)

// 总结: async函数和awite 一般结合使用, 实现以同步语法,获得异步promise结果, 它是对promise用法的升级优化


// 异步函数用法举例: 
var fs = require("fs")
var p1 = new Promise(function(resolve){
    fs.readFile("./data/a.txt",function(err,data){
        resolve(data)
    })  
})
var p2 = new Promise(function(resolve){
    fs.readFile("./data/b.txt",function(err,data){
        resolve(data)
    })  
})
var p3 = new Promise(function(resolve){
    fs.readFile("./data/c.txt",function(err,data){
        resolve(data)
    })  
})
var p4 = new Promise(function(resolve){
    fs.readFile("./data/d.txt",function(err,data){
        resolve(data)
    })  
})
// 多异步任务并发执行方案一: promise合并
var allP = Promise.all([p1,p2,p3,p4])
allP.then(function(res){
    console.log(res.join(""))
})
// 多异步任务并发执行方案二: 异步函数
async function getData(){
    var data1 = await p1;
    var data2 = await p2;
    var data3 = await p3;
    var data4 = await p4;
    console.log(data1 + data2 + data3 + data4)
}
getData()

//假设四个异步任务耗费的时间分别是 6ms, 8ms, 4ms, 3ms, 那么他们并发执行耗费的总时间就是8ms

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值