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