繁体   English   中英

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

[英]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)

这是 console.log 命令的屏幕截图: 在此处输入图片说明

这可能是我错过的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM