Когда я звоню const data = await cam.recordAsync(options);
, обещание сразу же разрешается и уходит очень рано, прежде чем я явно позвоню cam.stopRecording()
.
Я пытался передать экземпляр камеры как свойство, но у него проблемы с чтением функций этого свойства, таких как recordAsync. Операторы console.warn вызываются только один раз, поэтому функция не вызывается дважды.
/ CameraContainer.tsx
public render() {
return (
<Camera
onRecord={this.onRecord}
onCameraTouch={this.onCameraTouch}
isRecording={this.state.isRecording}
cameraType={this.state.cameraType} />
)
}
private onRecord = (cam: RNCamera) => {
this.setState(
{
isRecording: !this.state.isRecording
},
async () => {
console.warn(`recordingStatus changed to ${this.state.isRecording}`)
if (this.state.isRecording) {
const options: RecordOptions = {
quality: RNCamera.Constants.VideoQuality['480p'],
maxDuration: 15
};
console.warn(options);
try {
const data = await cam.recordAsync(options);
console.warn('recording finished navigating away');
this.props.navigation.navigate('RecordingReview', {
videoUri: data.uri
});
} catch {
console.warn('error');
}
} else {
console.warn('Stopping video recording');
// cam.stopRecording();
}
}
);
}
/ Camera.tsx
interface IProps {
cameraType: any,
isRecording: boolean,
onCameraTouch: () => void,
onRecord: (cam: RNCamera) => void,
}
export default class Camera extends PureComponent<IProps> {
private camera!: RNCamera;
public render() {
return (
<RNCamera
ref={(cam: RNCamera) => {
this.camera = cam;
}}
style={Styles.camera}
type={this.props.cameraType}
permissionDialogTitle={I18n.t('RECORDING_permissionTitle')}
permissionDialogMessage={I18n.t('RECORDING_permissionMessage')}
defaultVideoQuality={RNCamera.Constants.VideoQuality['480p']}
>
<RecordingControlsContainer
defaultCameraType={this.props.cameraType}
onCameraTouch={this.props.onCameraTouch}
onRecord={() => { this.props.onRecord(this.camera) }}
isRecording={this.props.isRecording} />
</RNCamera>
)
}
}
/ RecordingIconContainer.tsx
interface IProps {
style?: ViewStyle,
onRecord: () => void
}
interface IState {
isRecording: boolean
}
export default class RecordingIconContainer extends Component<IProps> {
public readonly state: IState = {
isRecording: false
};
public render() {
return (
<View style={this.props.style}>
<RecordingIcon onPress={this.flipIcon} isRecording={this.state.isRecording} />
</View>
)
}
private flipIcon = () => {
this.setState({ isRecording: !this.state.isRecording });
this.props.onRecord();
};
}
Я ожидаю, что await cam.recordAsync(options)
будет ждать до тех пор, пока не будет достигнут maxDuration
или maxFileSize
, или я явно позвоню cam.stopRecording()
, но он сразу исчезнет после того, как я начну запись.