异步功能不等待等待功能结束

时间:2020-03-21 15:11:58

标签: javascript asynchronous async-await

我有一个异步功能,它无法按预期工作,这是代码:

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上的屏幕截图: enter image description here

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

在此先感谢社区的帮助。

2 个答案:

答案 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);
// ...