[英]Async function does not wait for await function to end
我有一个无法按预期工作的异步函数,这是代码:
const onCreateCoachSession = async (event, context) => {
const { coachSessionID } = context.params;
let coachSession = event.val();
let opentokSessionId = 'prout';
await opentok.createSession({ mediaMode: 'relayed' }, function(
error,
session
) {
if (error) {
console.log('Error creating session:', error);
} else {
opentokSessionId = session.sessionId;
console.log('opentokSessionIdBefore: ', opentokSessionId);
const sessionId = session.sessionId;
console.log('Session ID: ' + sessionId);
coachSession.tokbox = {
archiving: true,
sessionID: sessionId,
sessionIsCreated: true,
};
db.ref(`coachSessions/${coachSessionID}`).update(coachSession);
}
});
console.log('opentokSessionIdEnd: ', opentokSessionId);
};
我的函数 onCreateCoachSession 在 firebase 事件(它是一个云函数)上触发,但它并没有结束 opentok.createSession 结束,我不明白为什么我之前放了一个等待。
谁能知道为什么我的代码直接触发最后一个控制台日志(opentokSessionIdEnd)
这可能是我错过的 async/await 的一个简单问题,但我看不到什么。
我提前感谢社区的帮助。
await 意味着它将等到承诺解决。 我想在这种情况下没有承诺返回。 您可以创建自己的承诺并处理案例
你在回调模式下使用createSession
(你给它一个回调函数),所以它不返回一个 Promise,所以它不能被await
ed。
两种解决方案:
1/ 在 Promise 模式下使用 createSession(如果允许,请参阅文档)
let session = null;
try{
session = await opentok.createSession({ mediaMode: 'relayed' })
} catch(err) {
console.log('Error creating session:', error);
}
或 2/ 等待一个 Promise
let session;
try {
session = await new Promise((resolve, reject) => {
opentok.createSession({ mediaMode: 'relayed' }, (error, session) => {
if (error) {
return reject(error)
}
resolve(session);
})
})
} catch (err) {
console.log('Error creating session:', err);
throw new Error(err);
}
opentokSessionId = session.sessionId;
console.log('opentokSessionIdBefore: ', opentokSessionId);
// ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.