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

我有一个不能按预期工作的异步函数,这里是代码:


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 顺序的屏幕截图:

http://img4.mukewang.com/628ee6890001276d17230514.jpg

这可能是我错过的一个简单的异步/等待问题,但我看不到什么。

我提前感谢社区的帮助。


至尊宝的传说
浏览 148回答 2
2回答

波斯汪

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

泛舟湖上清波郎朗

await 意味着它会等到 promise 被解决。我想在这种情况下没有返回任何承诺。您可以创建自己的承诺并处理此案
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript