*Promise
promise原文链接:https://www.jianshu.com/p/f3554f28f405
一、async/await的具体使用规则
一:凡是在前面添加了async的函数在执行后都会自动返回一个Promise对象
二:await必须在async函数里使用,不能单独使用
三:await后面需要跟Promise对象,不然就没有意义,而且await后面的Promise对象不必写then,因为await的作用之一就是获取后面Promise对象成功状态传递出来的参数。
二、async/await的错误处理方式
关于错误处理,如规则三所说,await可以直接获取到后面Promise成功状态传递的参数,但是却捕捉不到失败状态。在这里,我们通过给包裹await的async函数添加then/catch方法来解决,因为根据规则一,async函数本身就会返回一个Promise对象。
一个包含错误处理的完整的async/await例子:
let promiseDemo = new Promise((resolve, reject) => {
setTimeout(() => {
let random = Math.random()
if (random >= 0.5) {
resolve('success')
} else {
reject('failed')
}
}, 1000)
})
async function test() {
let result = await promiseDemo
return result //这里的result是promiseDemo成功状态的值,如果失败了,代码就直接跳到下面的catch了
}
test().then(response => {
console.log(response)
}).catch(error => {
console.log(error)
})
上面的代码需要注意两个地方,一是async函数需要主动return一下,如果Promise的状态是成功的,那么return的这个值就会被下面的then方法捕捉到;二是,如果async函数有任何错误,都被catch捕捉到!
三、在循环中使用await
必须使用for...of和for循环,不可使用map,froEach
参考下 Polyfill 版本的 forEach
while (index < arr.length) {
callback(item, index) //也就是我们传入的回调函数
}
for...of 是通过迭代器的方式去遍历。
let times = [1000, 500, 2000]
async function test() {
const iterator = times[Symbol.iterator]()
let res = iterator.next()
while (!res.done) {
const value = res.value
const res1 = await request(value)
console.log(res1)
res = iterator.next()
}
console.log('end')
}
async function test() {
let result = []
for (let item of times) {
let temp = await request(item)
result.push(temp)
}
return result
}