Node.js中如何获取并返回异步回调函数内部的返回值
问题原因
空值问题是异步回调执行顺序导致的:chimesdkmessaging.createChannel的回调函数属于异步执行逻辑,代码会先执行到末尾的return语句返回channel,此时回调还未触发,channel自然还是初始的null值。
解决方法
AWS SDK v2的接口默认支持.promise()调用,你可以把回调写法改成async/await写法,就能同步拿到异步返回的结果,修改后的代码如下:
async function createChannel(req) { let user_id = req.query.user_id; let chat_name = req.query.chat_name; var chimesdkmessaging = new AWS.ChimeSDKMessaging({region: region}); try { let dateNow = new Date(); const params = { Name: chat_name, AppInstanceArn: config.aws_chime_app_istance, ClientRequestToken: dateNow.getHours().toString() + dateNow.getMinutes().toString(), // 原代码这里漏了注释标记,已补充 ChimeBearer: await AppInstanceUserArn(user_id), // AppInstanceUserArn of the user making the API call. Mode: 'RESTRICTED', Privacy: 'PRIVATE' }; // 替换回调写法为await promise调用 const data = await chimesdkmessaging.createChannel(params).promise(); console.log(data); console.log('Assegno il canale: ' + data.ChannelArn); const channel = data.ChannelArn; // 拿到结果后再返回 return response({data: channel},200); } catch (e) { console.log(e, e.stack); return response({error: e}, 500); } }
修改逻辑说明:
- 调用
.promise()可以把AWS SDK的回调式接口转换成标准Promise对象,直接用await等待异步执行完成,就能拿到返回结果 - 错误逻辑会直接被外层的try/catch捕获,不需要在回调里单独做错误处理
- 成功返回逻辑挪到try块内拿到结果之后,保证返回时
channel已经完成赋值
内容的提问来源于stack exchange,提问作者Mariano
相关产品推荐
相关产品推荐

