我有一个异步功能,它无法按预期工作,这是代码:
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)
这可能是我错过的一个简单的异步/等待问题,但是我看不到。
在此先感谢社区的帮助。
答案 0 :(得分:0)
await表示它将等待,直到兑现承诺。我猜在这种情况下没有任何承诺可以返回。您可以创建自己的承诺并处理案件
答案 1 :(得分:0)
您在回调模式下使用createSession
(您为其提供了回调函数),因此它不会返回Promise,因此无法进行await
编辑。
两种解决方案:
1 /在Promise模式下使用createSession(如果允许,请参见文档)
let session = null;
try{
session = await opentok.createSession({ mediaMode: 'relayed' })
} catch(err) {
console.log('Error creating session:', error);
}
或2 /等待诺言
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);
// ...