получение возвращаемого значения из асинхронной функции без ее повторного вызова

#javascript #async-await

#javascript #асинхронный-ожидание

Вопрос:

Вот код:

 const onStartRecord = async() => {
  try {
    const path = Platform.select({
      ios: `file:///audio/${filenameGenerator}.m4a`,
      android: `file:///audio/${filenameGenerator}.mp4`,
    });
    const audioSet: AudioSet = {
      AudioEncoderAndroid: AudioEncoderAndroidType.AAC,
      AudioSourceAndroid: AudioSourceAndroidType.MIC,
      AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType.high,
      AVNumberOfChannelsKeyIOS: 2,
      AVFormatIDKeyIOS: AVEncodingOption.aac,
    };
    console.log('audioSet', audioSet);
    const uri = await audioRecorderPlayer.startRecorder(path, audioSet);
    audioRecorderPlayer.addRecordBackListener((e: any) => {
      setAudioProp(audioProp => {
        return { ...audioProp,
          recordSecs: e.current_position,
          recordTime: audioRecorderPlayer.mmssss(Math.floor(e.current_position)),
        }
      });

    });

    console.log(`uri: ${uri}`);
    return uri
  } catch (err) {
    console.log(err);
    return;
  }
};

const audioPath = async() => {
  const result = await onStartRecord();
  return resu<
}

const onSubmit = async() => {
  const audiopath = await audioPath();
  console.log("this is the audiopath", audiopath)
}
};
 

Я могу получить то, что хочу, когда запускаю функцию onSubmit, но проблема в том, что она также снова запускает функцию onStartRecord, что в моем случае приведет к ошибке, я просто хочу получить uri, сгенерированный при разрешении onStartRecord, но я не хочу запускать его снова, так что я могучто делать, если мне нужно использовать функцию onSubmit и получить значение из onStartRecord? спасибо!

Ответ №1:

Вместо того, чтобы возвращать uri , onStartRecord следует присвоить его глобальной переменной.

Затем audioPath() можно вернуть эту переменную.

 let savedAudioPath;

const onStartRecord = async() => {
  try {
    const path = Platform.select({
      ios: `file:///audio/${filenameGenerator}.m4a`,
      android: `file:///audio/${filenameGenerator}.mp4`,
    });
    const audioSet: AudioSet = {
      AudioEncoderAndroid: AudioEncoderAndroidType.AAC,
      AudioSourceAndroid: AudioSourceAndroidType.MIC,
      AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType.high,
      AVNumberOfChannelsKeyIOS: 2,
      AVFormatIDKeyIOS: AVEncodingOption.aac,
    };
    console.log('audioSet', audioSet);
    const uri = await audioRecorderPlayer.startRecorder(path, audioSet);
    audioRecorderPlayer.addRecordBackListener((e: any) => {
      setAudioProp(audioProp => {
        return { ...audioProp,
          recordSecs: e.current_position,
          recordTime: audioRecorderPlayer.mmssss(Math.floor(e.current_position)),
        }
      });

    });

    console.log(`uri: ${uri}`);
    savedAudioPath = uri;
  } catch (err) {
    console.log(err);
    return;
  }
};

const audioPath = async () => savedAudioPath;
 

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

1. Спасибо, Бармар, я попробовал ваш код, но, тем не менее, он снова запускает onStartRercord, который вернет что-то, чего я не хочу

2. Я не думаю, что это должно произойти, если вы не вызовете его снова до того, как вернется первый вызов.

3. потому что, когда я воспроизводю аудиофайл, это не то, что я записываю при первом нажатии (я имею в виду первый раз, когда я запускаю onStartRecord), но файл записал звук после того, как я нажал кнопку onSubmit

4. Вы видите сообщения журнала со onStartRecord() второго раза?

5. любая помощь, plzzzzz ~~