async await primise的区别
- async/await:是一个用同步思维解决异步问题的方案
-
async/await是ES7新特性
-
async/await是写异步代码的新方式,以前的方法有回调函数和Promise
-
async/await是基于Promise实现的,它不能用于普通的回调函数
-
async/await与Promise一样,是非阻塞的
-
async/await使得异步代码看起来像同步代码,解决了异步代码同步化的问题
async定义的函数的返回值是Promise对象,换句话说,async 本身是一个语法糖,而语法糖则代表了带有一定功能的关键字. 所以async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。
async函数
async函数的功能:创建并返回一个promise对象:
async function foo (p){
console.log('foo run',p);
return 1
}
var res = foo(1);
console.log(res); //Promise { <state>: "fulfilled", <value>: 1 }
//<state>: "fulfilled"
//<value>: 1
通过上面代码可以看出async创建的foo实则是一个promise对象, async 函数返回的 Promise 的结果由函数执行的结果决定 ,而传递async返回值的方法有以下几种方式:
//1.async函数的 return
async function foo (p){
return p
}
var res = foo(1);
res.then((m)=>{
console.log(m); //1
})
//2: new promise中 resolve实参
async function foo(){
return new Promise((reslove,reject)=>{
reslove(112)
})
}
foo().then((m)=>{
console.log(m); //112
})
//3: then 中return (catch finally 中retrun)
async function foo(){
return foo1().then((m)=>{
return m
})
}
async function foo1(){
return 2
}
foo().then((n)=>{
console.log(n); //2
})
//4: Promise.resolve() 实参 Promise.reject() 实参
async function foo(){
return Promise.resolve(12)
}
foo().then((m)=>{
console.log(m);//12
})
await函数
** await 右侧的表达式一般为 promise 对象, 但也可以是其它的值 **
- 如果表达式是 promise 对象, await 返回的是 promise 成功的值
- 如果表达式是其它值, 直接将此值作为 await 的返回值
- await函数必须写在async函数内
async function f() {
// 等同于
// return 123;
return await 123;
}
f().then(v => console.log(v))
// 123
function foo(m){
return new Promise((reslove,reject)=>{
setTimeout(reslove,m)
})
}
async function foo1(){
for(let i = 1 ; i<5 ; i++){
console.log(i); //1,2,3,4每隔1s执行一次
await foo(1000)
}
}
foo1()
Promise
是ES6中的一个内置对象,实际是一个构造函数,是JS中进行异步编程的新的解决方案。
可看作者另一片文章
区别
- Promise是ES6,而async是ES7
- 使用async函数可以让代码简洁很多,不需要像Promise一样需要些then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。
- Promise 中不能自定义使用 try/catch 进行错误捕获,但是在 Async/await 中可以像处理同步代码处理错误 ,简而言之就是Async/await更好的解决了异步代码同步化的问题
- Promise有很多并行神器,比如Promise.all\Promise.race等。这些是async没法搞定的