如何避免在JavaScript中使用.then()地狱? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免在JavaScript中使用.then()地狱? [重复]相关的知识,希望对你有一定的参考价值。

此问题已经在这里有了答案:

我很难排序我的API调用。所以我使用了then()链来对它们进行排序。所有API和刷新令牌都是Promises / Async。它正在工作,但是有没有使用async / await的更简洁/更简单/更短的方法,因为我的父函数不是异步的。我不完全了解.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之前的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))
    

另一答案

如果使用的是ES6及更高版本,则可以使用异步等待

以上是关于如何避免在JavaScript中使用.then()地狱? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ionic3 异步请求中.then的作用,以及如何理解JavaScript Promise

如何在写await async的时候不用try catch

如何在 JavaScript -JQuery 中否定“if”语句块中的代码,例如“if not then ..”

clickhouse:如何避免 DB::Exception:除以零

javascript中的.then函数有啥用? [复制]

如何在fetch then / response函数中访问请求对象