Черный экран с Agora и React Native при вызове функции после запроса API

Мое приложение (построенное с помощью react native) использует Agora для видео / аудио звонков. Я следовал официальной документации, и все работает отлично, когда я жестко кодирую свой временный токен и идентификатор приложения в своем приложении. Однако, когда я хочу получить эти две переменные динамически через мой собственный сервер и вызвать функцию createAgora после того, как я извлек эти переменные с моего сервера, экран (и звук) останется черным. Журнал не выводит никаких ошибок. Все нормально выглядит. Не знаю, почему так происходит.

useEffect(() => {
    log('agora mount', channel, role);
    isHost( role === "host" ? true : false );
    connect();
    return destroyAgora;
}, [show]);

const connect = async () => {
    API.get('/api/agora', {})
        .then(function(res){
            if(res.data && res.data.agora.token){

                const app_id = res.data.agora.app_id;
                const token = res.data.agora.token;

                createAgora(app_id)
                .then( () => joinAgora(token) )
                .catch( (err) => log("agora (!) create error: " + err) );

            } else {
                log("agora token error: empty");
            }
        }).catch( (err) => {
            log("agora token error: " + err);
        });
}

const AgoraEngine = useRef<RtcEngine>();

const createAgora = async (app_id:string) => {
    AgoraEngine.current = await RtcEngine.create(app_id);
    AgoraEngine.current.setVideoEncoderConfiguration({ dimensions: {width: 1280, height: 720}, frameRate: 30 });
    AgoraEngine.current.enableVideo();
    AgoraEngine.current.setChannelProfile(ChannelProfile.LiveBroadcasting);
    const Role = (role === "host" ? ClientRole.Broadcaster : ClientRole.Audience);
    AgoraEngine.current.setClientRole(Role);

    AgoraEngine.current.addListener("JoinChannelSuccess", (channel, uid, elapsed) => {
        isWatching(true);
    });
};

person John Brunner    schedule 13.04.2021    source источник
comment
Привет, могу я получить вашу электронную почту / контактную информацию в социальных сетях или могу увидеть ваш код? На прошлой неделе я боролся с агорой   -  person Aqsa Maan    schedule 14.04.2021


Ответы (1)


Я считаю, что проблема в коде с then для присоединения к joinAgora. В приведенном ниже коде я создал две переменные состояния. используйте useEffect для прослушивания appId изменения, await для завершения этой операции, затем вызовите joinAgora с token

const [appId, setAppId] = useState(null);
const [appToken, setAppToken] = useState(null);

useEffect(()=>{
   const createThenConnect = async ()=>{
       await createAgora(appId);
       try {
          joinAgora(appToken);
       } catch (ex) {
          log("agora (!) create error: " + ex)
       }
   }
   if (appId !== null) { 
       createThenConnect();
   }
},[appId])

const connect = async () => {
    API.get('/api/agora', {})
        .then(function(res){
            if(res.data && res.data.agora.token){

                setAppId(res.data.agora.app_id);
                setAppToken(res.data.agora.token);
            } else {
                log("agora token error: empty");
            }
        }).catch( (err) => {
            log("agora token error: " + err);
        });
}
person Wen W    schedule 13.04.2021