#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 ~~