能否不使用async/await解析Axios返回的Promise?
不用async/await解析Axios返回的Promise完全可行!
当然可以!async/await本质上只是Promise的语法糖,你完全可以用Promise原生的.then()/.catch()链式调用来处理Axios返回的异步结果——甚至你的bing_web_search函数本身已经在这么做了😉
你的函数已经返回了Promise
先看你的bing_web_search函数:它返回的是Axios请求后的Promise链,.then()会把解析后的response.data.webPages作为新Promise的结果返回,.catch()则捕获请求中的错误。所以在控制器里调用它时,直接链式调用.then()就能拿到数据,根本不需要async/await。
控制器中的调用示例
比如你的控制器函数可以这么写:
// 控制器里的处理函数(普通函数,无需async) function handleSearchRequest(req, res) { const searchTerm = req.query.search; // 调用bing_web_search,用.then处理成功结果 bing_web_search(searchTerm) .then(webPagesData => { // 拿到解析后的webPages数据,做后续业务处理 console.log('搜索结果:', webPagesData); res.status(200).json({ success: true, results: webPagesData }); }) .catch(error => { // 捕获请求过程中出现的所有错误(包括Axios请求失败、函数内部抛出的错误) console.error('搜索出错:', error); res.status(500).json({ success: false, message: '搜索请求失败,请稍后重试' }); }); }
优化你的错误处理
注意你的原函数中.catch()只做了console.log(error),这样错误不会传递到调用方的.catch()里。建议修改一下,让Promise在出错时明确reject,这样调用方可以统一处理错误:
let bing_web_search = function(search) { let searchEncoded = encodeURIComponent(search); return axios.get( 'https://api.cognitive.microsoft.com/bing/v7.0/search?q=' + searchEncoded + '+site:https://learn.microsoft.com/en-us/azure/&mkt=en-us', { headers: { 'Ocp-Apim-Subscription-Key' : process.env.BING_SUBSCRIPTION_KEY } } ) .then(function(response) { return response.data.webPages; }) .catch(function(error) { console.log(error); // 将错误抛出,让调用方的catch能捕获到 return Promise.reject(error); }); }
原理说明
Promise的核心就是通过链式调用处理异步操作:
.then()会在Promise成功resolve时执行,接收resolve的结果作为参数.catch()会在Promise被reject时执行,接收错误信息作为参数- 整个链式调用的每一步都会返回一个新的Promise,所以可以一直链式写下去
async/await只是把这种链式写法转换成了类似同步代码的风格,底层还是Promise机制,所以不用它完全没问题。
内容的提问来源于stack exchange,提问作者A. Cam
相关产品推荐
相关产品推荐

