es7 Promise和Async await同步操作多个异步方法
一.Promise
1.返回一个promise对象,函数前面的async
一词意味着一个简单的事情:这个函数总是返回一个promise,如果代码中有return <非promise>
语句,JavaScript会自动把返回的这个value值包装成promise的resolved值。
2.<1>关键词await
可以让JavaScript进行等待(类似于then),直到一个promise执行并返回它的结果,JavaScript才会继续往下执行。
<2>await只能在async中使用
<3>await后面要是promise对象
eg1:以下是一个promise在1s之后resolve的例子:
async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve('done!'), 1000)
})
let result = await promise // 直到promise返回一个resolve值(*)
alert(result) // 'done!'
}
f()
eg2:
async function showAvatar() {
// read our JSON
let response = await fetch('/article/promise-chaining/user.json')
let user = await response.json()
// read github user
let githubResponse = await fetch(`https://api.github.com/users/${user.name}`)
let githubUser = await githubResponse.json()
// 展示头像
let img = document.createElement('img')
img.src = githubUser.avatar_url
img.className = 'promise-avatar-example'
documenmt.body.append(img)
// 等待3s
await new Promise((resolve, reject) => {
setTimeout(resolve, 3000)
})
img.remove()
return githubUser
}
showAvatar()
3.错误处理
await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。
async function myFunction() {
try {
await somethingThatReturnsAPromise();
} catch (err) {
console.log(err);
}
}
// 另一种写法
async function myFunction() {
await somethingThatReturnsAPromise().catch(function (err){
console.log(err);
});
}
4.async await同步执行多个异步代码
async function f() { let promise1 = new Promise((resolve, reject) => { setTimeout(() => resolve('1000'), 1000) }) let promise2 = new Promise((resolve, reject) => { setTimeout(() => resolve('2000'), 2000) }) let promise3 = new Promise((resolve, reject) => { setTimeout(() => resolve('3000'), 3000) }) let promise4 = new Promise((resolve, reject) => { setTimeout(() => resolve('4000'), 4000) }) let result1 = await promise4 console.log(result1) let result2 = await promise3 console.log(result2) let result3 = await promise2 console.log(result3) let result4 = await promise1 console.log(result4) } f()