Open ZhengXingchi opened 4 years ago
Async/Await 让 try/catch 可以同时处理同步和异步错误。在下面的 promise 示例中,try/catch 不能处理 JSON.parse 的错误,因为它在 Promise 中。我们需要使用.catch,这样错误处理代码非常冗余。并且,在我们的实际生产代码会更加复杂。
Promise
const makeRequest = () => {
try {
getJSON().then(result => {
// JSON.parse可能会出错
const data = JSON.parse(result);
console.log(data);
});
// 取消注释,处理异步代码的错误
// .catch((err) => {
// console.log(err)
// })
} catch (err) {
console.log(err);
}
};
async/await
const makeRequest = async () => {
try {
// this parse may fail
const data = JSON.parse(await getJSON());
console.log(data);
} catch (err) {
console.log(err);
}
};
promise3只需要value2
const makeRequest = () => {
return promise1().then(value1 => {
return value1
})
.then(value1 => {
return promise2(value1)
})
.then(value2 => {
return promise3(value2)
});
};
当Promise3需要value1和value2
const makeRequest = () => {
return promise1().then(value1 => {
return promise2(value1).then(value2 => {
return promise3(value1, value2)
})
})
};
刚从嵌套出来又进入嵌套了,地狱啊。这时候你会心一笑,机智如我,写出以下代码
const makeRequest = () => {
return promise1().then(value1 => {
return Promise.all([value1, promise2(value1)])
})
.then(([value1, value2]) => {
})
};
这时候我就想一嘴的汽水喷死你,你这不是高射炮打苍蝇(多此一举) 吗?杀鸡焉用牛刀呢。 这种方法为了可读性牺牲了语义。除了避免嵌套,并没有其他理由将 value1 和 value2 放在一个数组中。 好到用在刀刃上,这时候async/await闪亮登场,当当当。。。
const makeRequest = async () => {
const value1 = await promise1();
const value2 = await promise2(value1);
return promise3(value1, value2);
};