JavaScript使用async/await执行异步代码无法获取返回值问题求解
问题原因
- 你使用的
request是回调风格的异步API,await仅能对返回Promise的函数生效,当前createObject没有返回Promise,代码执行不会等待HTTP请求完成就会直接往下走 - 你在调用
request后立刻同步读取res.body.id,此时HTTP请求还未完成,回调函数尚未触发,res中没有返回的响应数据,所以拿到的是undefined
修复方案
将createObject改造为返回Promise的函数,把HTTP请求的结果放到回调中通过Promise抛出,改造后的代码如下:
// 改造createObject返回Promise function createObject() { return new Promise((resolve, reject) => { try { console.log("Processing POST Loan."); const data = { "value1": 1288, "value2": [{ "value3": 3833, "value4": [{ "value5": new Date() }] }] } const auth = Buffer.from("login:pass").toString('base64') request("http://url.com/resource", { method: "POST", headers: { 'Content-Type': 'application/json', 'Authorization': "Basic " + auth }, body: JSON.stringify(data) }, function (error, response, body) { // 回调里处理返回结果 if (error) { reject(error) return } // 注意body是字符串,要先转成JSON对象 const resBody = JSON.parse(body) resolve(resBody.id) }) } catch (err) { reject(err) } }) } async function uploadReport() { try { console.log('create object') const objectId = await createObject(); console.log('object = ' + objectId) } catch (err) { // 统一处理错误 console.error('请求出错:', err) } } uploadReport()
补充说明
如果项目允许升级依赖,更推荐使用原生fetch或者axios这类默认支持Promise的HTTP请求库,无需手动包装回调,代码会更简洁。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

