Ошибка React Native при отклонении необработанных обещаний

#react-native

#react-native

Вопрос:

Я использую Agora для отправки сообщения через поток данных, он выдает эту ошибку, когда я пытаюсь сделать это после перехода на другой канал (т.Е. с канала 1 и 2). Может кто-нибудь, пожалуйста, помочь объяснить, что означает эта ошибка и как ее решить? Я искал в Google и, похоже, ничего не смог найти. Большое спасибо!

 Error: invalid argument
promiseMethodWrapper@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2275:45
sendStreamMessage@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:99747:47
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:98393:35
onPress@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:98579:46
onPress@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:68941:35
_performTransitionSideEffects@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54979:22
_receiveSignal@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54921:45
onResponderRelease@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:54830:34
invokeGuardedCallbackImpl@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12804:21
invokeGuardedCallback@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12898:42
invokeGuardedCallbackAndCatchFirstError@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12902:36
executeDispatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12974:48
executeDispatchesInOrder@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:12994:26
executeDispatchesAndRelease@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14069:35
forEach@[native code]
forEachAccumulated@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:13136:22
runEventsInBatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14093:27
runExtractedPluginEventsInBatch@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14172:25
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14148:42
batchedUpdates$1@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:24797:20
batchedUpdates@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14055:36
_receiveRootNodeIDEvent@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14147:23
receiveTouches@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:14200:34
__callFunction@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2798:36
http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2530:31
__guard@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2752:15
callFunctionReturnFlushedQueue@http://localhost:8081/index.bundle?platform=iosamp;dev=trueamp;minify=false:2529:21
callFunctionReturnFlushedQueue@[native code]
  

Редактировать:
Класс

   // States for buttons (touchable highlights).
  state = {
    micPressed: false,
    dotMorsePressed: false,
    dashMorsePressed: false,
    channel1Pressed: false,
    channel2Pressed: false,
  };

  componentDidMount() {
      SplashScreen.hide();
      this.init()
  }

  init = async () => {
    // Initialize RtcEngine and event listeners.
      engine = await RtcEngine.create('74a529c906e84fe8bfe4a236869b736f');
      try {
          dataStreamId = await engine.createDataStream(true, true);
      } catch(error) {
          console.log(error.message);
      }
      console.log("dataStream: ", dataStreamId);
      Sound.setCategory('Playback');
      beep = new Sound('beep.wav', Sound.MAIN_BUNDLE, (error) => {
          if (error) {
              console.log('failed to load the sound', error);
              return;
          }
      })
      engine.addListener('StreamMessage', (uid, streamId, data) => {
          console.log('stream message was received: ', data, ' from: ', streamId )
          receivedMorse = data;
          console.log(receivedMorse);
          if(receivedMorse == 'dot'){
              beep.setCurrentTime(9.9);
              beep.play();
          } else {
              beep.setCurrentTime(9.7);
              beep.play();
          }
      })
      engine.addListener('StreamMessageError', (uid, streamId, err, missed, cached) => {
          console.log('StreamMessageError: ', err)
      })
      engine.addListener('JoinChannelSuccess', (channel, uid, elapsed) => {
          console.log('channel was joined succesfully')
      })
      engine.addListener('LeaveChannel', (channel, uid, elapsed) => {
          console.log('channel was left succesfully')
      })
      engine.addListener('Warning', (warn) => {
          console.log('Warning', warn)
      })
      engine.addListener('Error', (err) => {
          console.log('Error', err)
      })
  }
  

Функции:

  // Functions.
  micPressedFunc = () => {
    // Function to enable microphone and mute speaker when mic button is pressed.
    engine.adjustRecordingSignalVolume(100);
    engine.adjustAudioMixingVolume(0);
  };

  micReleasedFunc = () => {
    // Function to mute microphone and enable speaker when mic button is released.
    engine.adjustRecordingSignalVolume(0);
    engine.adjustAudioMixingVolume(100);
  };

  dotMorsePressedFunc = () => {
    // Function to send dot to other users in the channel.
    engine.sendStreamMessage(dataStreamId, 'dot');
    beep.setCurrentTime(9.9);
    beep.play();
  };

  dashMorsePressedFunc = () => {
    // Function to send dash to other users in the channel.
    engine.sendStreamMessage(dataStreamId, 'dash');
    beep.setCurrentTime(9.7);
    beep.play();
  };

  channel1PressedFunc = () => {
    // Function to leave previous channel and join channel 1.
    engine.leaveChannel();
    engine.joinChannel(null, 'walt-channel-1', null, 0);
    engine.adjustRecordingSignalVolume(0);
    engine.adjustAudioMixingVolume(100);
    isConnected = true;
    this.setState({
      channel1Pressed: true,
      channel2Pressed: false,
    });
  };

  channel2PressedFunc = () => {
    // Function to leave previous channel and join channel 2.
    engine.leaveChannel();
    engine.joinChannel(null, 'walt-channel-2', null, 0);
    engine.adjustRecordingSignalVolume(0);
    engine.adjustAudioMixingVolume(100);
    isConnected = true;
    this.setState({
      channel2Pressed: true,
      channel1Pressed: false,
    });
  };
  

Комментарии:

1. Пожалуйста, добавьте немного исходного кода. Само по себе это не помогает.

2. @sfratini я добавил некоторый исходный код по вашему запросу.

3. Все ли они синхронны с выходом / присоединением к каналу? Я мог бы ожидать, что это будут обещания или какие-то длительные операции, которые, возможно, придется подождать. Но это только мои догадки.

4. @sfratini это асинхронно

Ответ №1:

Просматривая документацию, кажется, что вы неправильно обрабатываете события и порядок. Например, в канале leave говорится следующее:

«После присоединения к каналу пользователь должен вызвать метод leaveChannel для завершения вызова перед присоединением к другому каналу. Этот метод возвращает 0, если пользователь покидает канал и освобождает все ресурсы, связанные с вызовом. Этот вызов метода является асинхронным, и пользователь не вышел из канала, когда возвращается вызов метода. Как только пользователь покидает канал, SDK запускает обратный вызов onLeaveChannel «.

Таким образом, по сути, пользователь, присоединяющийся / покидающий канал, не является немедленным, и вам приходится иметь с этим дело. Я не могу сказать точную проблему, но я могу сказать, что я не думаю, что вы правильно обрабатываете жизненный цикл.

По крайней мере, вы можете попытаться дождаться методов из движка, но одного этого может быть недостаточно. Возможно, вам потребуется покинуть канал, а затем присоединиться к новому, как только вы получите подтверждение.