关于ES7中的async

关于ES7中的Async

概念

真正意义上去解决异步回调的问题,同步流程表达异步操作

描述

异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果。

本质

Generator的语法糖

语法

结构

	asycn function name([param[, param[, ... param]]])
    {
     
		 [return_value] = await expression;
		 //await 异步操作;
    }
参数

name:函数名

param:形参,要传递给函数的参数

expression:等待一个函数或表达式(通常情况下是一个返回Promise 对象的函数)

return_value:如果 await 操作符后的表达式的值不是一个 Promise,
则返回该值本身

asycn 函数返回值:返回的总是Promise对象(如果返回的不是一个promise,JavaScript也会自动把这个值"包装"成Promise的resolve值)

语法规定:await命令只能出现在 async 函数内部,否则会报错。

特点
  1. 不需要像Generator去调用next方法,遇到await等待,当前的异步操作完成就往下执行
  1. 返回的总是Promise对象,可以用then方法进行下一步操作
  1. async取代Generator函数的星号*,await取代Generator的yield
  1. 语意上更为明确,使用简单,暂时没有不良反应
举例

函数前面使用了async关键字,返回一个promise对象。

async function aFun()
{
     
	//expression  通常情况下是一个返回Promise 对象的函数foo()
	return await foo();
}
console.log(aFun());  //Promise {<pending>}

如果返回的不是一个promise,JavaScript也会自动把这个值"包装"成Promise的resolve值。


async function test()
{
     
	return "Hello async";
}
//返回的是Promise对象
console.log(test());   				// Promise {<resolved>: "Hello async"}

//在最外层不能用 await 获取其返回值的情况下
///可以用then() 链来处理这个 Promise 对象
test().then((v=>console.log(v)));  //"Hello async"

await 等待一个函数或表达式

async function test1()
{
     
	let str=await "Hello async";
	console.log(str);  //str="hello async" 
	//得到的是一个字符串,不是Promise 一个对象
}

console.log(test1());  //Promise {<pending>}
//test1()  返回的是一个Promise对象     
关于await

await的执行顺序为从右到左,会阻塞后面的代码执行,但并不是直接阻塞await的表达式。

当await 等到的:

  1. 不是一个 promise 对象,await会阻塞后面的代码,会先执行async外面的同步代码(外面的同步代码await执行完后,会让出线程),等外面的同步代码执行完成在执行async中的代码。
  1. 一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码外面的同步代码await执行完后,会让出线程,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为await 表达式的运算结果。
async function test()
{
     
	return "Hello async";
}
test().then(<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值