为了账号安全,请及时绑定邮箱和手机立即绑定

异步函数不等待等待函数结束

异步函数不等待等待函数结束

至尊宝的传说 2022-05-26 10:30:55
我有一个不能按预期工作的异步函数,这里是代码: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 结束,我不明白为什么我之前放了一个 await 。谁能知道为什么我的代码直接触发最后一个控制台日志(opentokSessionIdEnd)这是按 console.log 顺序的屏幕截图:这可能是我错过的一个简单的异步/等待问题,但我看不到什么。我提前感谢社区的帮助。
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

你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/ 等待一个 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);

// ...


查看完整回答
反对 回复 2022-05-26
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

await 意味着它会等到 promise 被解决。我想在这种情况下没有返回任何承诺。您可以创建自己的承诺并处理此案



查看完整回答
反对 回复 2022-05-26
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信