javascript - 如何在 javascript 中避免 .then() 地狱?
问题描述
我很难对 API 调用进行排序。所以我使用 then() 链接按顺序排列它们。所有 API 和刷新令牌都是 Promises/Async。它正在工作,但是否有更清洁/更漂亮/更短的方法而不使用异步/等待,因为我的父函数不是异步的。我不完全理解 .then() 和 async/await 的行为
这是父函数内部的代码:
refreshToken().then(token => {
let request = {} //format request
return axios.post(`${youtubeUrl}/upload/youtube/v3/videos?access_token=${token}&part=contentDetails`, request) //upload video
})
.then(uploadResponse => {
let uploadResponse = {}; //format uploadResponse
refreshToken().then(token => { //refresh the token again
return axios.put(`${youtubeUrl}?access_token=${token}`, uploadResponse) //update existing video
})
.then(updateResponse => {
let updateResponse = {}; //format updateResponse
axios.post(`${BasePath}/v1/videos`, updateResponse, headers)
.then(postResponse => {
if (postResponse.data.response === 'success') {
return dispatch(receivePostsData(postResponse.data))
} else if (postResponse.data.response === 'failed') return dispatch(receivePostsData(postResponse.data))
})
})
})
.catch(error => {
return dispatch(receivePostsData(error))
})
解决方案
使用 aysnc await 您可以将回调地狱转换为:
重要说明是:
- 函数允许使用 await 之前的 async 关键字
- 要处理异常,您需要使用 try catch 块。
async function uploadToYoutube() {
try {
let token = await refreshToken();
let request = {}
const youtubeUploadResponse = await axios.post(`${youtubeUrl}/upload/youtube/v3/videos?access_token=${token}&part=contentDetails`, request);
let uploadResponse = {};
token = await refreshToken();
const youtubeUpdateResponse = await axios.put(`${youtubeUrl}?access_token=${token}`, uploadResponse);
let updateResponse = {};
let postResponse = await axios.post(`${BasePath}/v1/videos`, updateResponse, headers);
if (postResponse.data.response === 'success') {
return dispatch(receivePostsData(postResponse.data))
} else if (postResponse.data.response === 'failed') {
//??? why do you here act like a success?
return dispatch(receivePostsData(postResponse.data))
}
} catch (error) {
//??? why do you here act like a success?
return dispatch(receivePostsData(error))
}
}
推荐阅读
- excel - 所有减法的总和,同时排除带有文本的单元格
- prolog - SICStus Prolog 垃圾收集跟踪消息
- spring-boot - keycloak 是否支持 mongodb 作为数据库?
- wpf - 如何更改 radtabcontrol 的非 radtabitems 背景颜色?
- javascript - JavaScript 中的 If Else 语句在 Internet Explorer 中无法正常运行
- angular - ag 网格无法正确显示角度
- anaconda - Anaconda Jypiter 无法启动,Spyder 报告错误
- c# - DNN DDR 模块 - 获取当前页面名称和描述
- r - 不能在 sapply 中使用survey_mean
- java - 在tomcat服务器中部署依赖应用