Как вызвать асинхронную функцию в textinput? - PullRequest
0 голосов
/ 15 февраля 2019

Как вызвать асинхронную функцию с помощью in textinput?

getTxt = async () => {

    filetxt = 'abc';
    currentFileName = this.props.navigation.getParam("currentFileName");
    console.log(currentFileName);

    try {

        filetxt = FileSystem.readAsStringAsync(`${FileSystem.documentDirectory}${currentFileName}.txt`, { encoding: FileSystem.EncodingTypes.UTF8 });

        console.log(filetxt);

    } catch (error) {
        console.log(error);
    }

    return filetxt;
}

render() {

    return (
        <View style={{ flex: 1 }}>
            <TextInput
                multiline = {true}
                style={{ margin : 10 }}
            >{ await this.getTxt() }
            </TextInput>
            <Button onPress = { this.FunctionToOpenFirstActivity } title = 'Save'/>
        </View>
    );
}

Возникает ошибка "ожидайте зарезервированные слова", кто-нибудь знает?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Рендеринг не является асинхронной функцией, поэтому вы не можете использовать await при рендеринге, вы можете сделать это в componentWillMount и сохранить его в состоянии, указанном в методе рендеринга

0 голосов
/ 15 февраля 2019

Вам нужно изменить код, чтобы получить желаемый результат.Вы не можете использовать await в render (), который не является асинхронной функцией.Если вы вызываете асинхронную функцию getTxt без ожидания, она вернет обещание.Таким образом, текстовый файл будет пустым во время рендеринга.Вам нужно использовать состояние для автоматического повторного рендеринга при изменении значения.

// Initialise filetext with state
constructor(props) {
    super(props);
    this.state = {
      filetext: ""
    };
  }
// Make componentWillMount async and invoke getTxt with await
async componentWillMount() {
 let text = await this.getTxt();
 this.setState({ filetext: text });
}

//Access filetext from the state so that it will automatically re-render when value changes

render() {

    return (
        <View style={{ flex: 1 }}>
            <TextInput
                multiline = {true}
                style={{ margin : 10 }}
            >{ this.state.filetext }
            </TextInput>
            <Button onPress = { this.FunctionToOpenFirstActivity } title = 'Save'/>
        </View>
    );
}
0 голосов
/ 15 февраля 2019

Вы можете вызвать функцию без ключевого слова await

this.getTxt()

Ваш код будет выглядеть так:

getTxt = async () => {

    filetxt = 'abc';
    currentFileName = this.props.navigation.getParam("currentFileName");
    console.log(currentFileName);

    try {

        filetxt = FileSystem.readAsStringAsync(`${FileSystem.documentDirectory}${currentFileName}.txt`, { encoding: FileSystem.EncodingTypes.UTF8 });

        console.log(filetxt);

    } catch (error) {
        console.log(error);
    }

    return filetxt;
}

render() {

    return (
        <View style={{ flex: 1 }}>
            <TextInput
                multiline = {true}
                style={{ margin : 10 }}
            >{ this.getTxt() }
            </TextInput>
            <Button onPress = { this.FunctionToOpenFirstActivity } title = 'Save'/>
        </View>
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...