#javascript #react-native #async-await #promise
#язык JavaScript #реагировать-родной #асинхронное ожидание #обещать
Вопрос:
У меня есть компонент MicButtons.js что является обещанием
import Voice from 'react-native-voice' export const MicButton = async () =gt; { Voice.start('en-US') Voice.onSpeechResults = async (res) =gt; { res = await JSON.parse(JSON.stringify(res)).value[0] return res } }
И когда я пытаюсь использовать его в другом компоненте, ожидание не работает, и предупреждение показывает «неопределенно».
import MyButton from '../components/MyButton'; import { MicButton } from '../components/MicButton'; //... lt;MyButton h="80%" w="50%" srcImg={mic} func={async() =gt; { let command = await MicButton() alert(command) }}gt;lt;/MyButtongt;
Вот как MyButton
выглядит компонент:
import React from 'react'; import PropTypes from 'prop-types' import { Text, View, TouchableOpacity, ImageBackground } from 'react-native'; const MyButton = ({ text="", h, w, srcImg, func=()=gt;{} }) =gt; { return ( lt;View style={{height: h, width: w}}gt; lt;TouchableOpacity style={{ height: '100%', width: '100%'}} onPress={func}gt; lt;ImageBackground source={srcImg} style={{flex: 1}}gt; lt;Textgt;{text}lt;/Textgt; lt;/ImageBackgroundgt; lt;/TouchableOpacitygt; lt;/Viewgt; ) } MyButton.PropTypes = { text: PropTypes.string, h: PropTypes.number, w: PropTypes.number, srcImg: PropTypes.object, func: PropTypes.func } export default MyButton
Комментарии:
1.
MicButton
ничего не возвращает2. Ваша
MicButton()
функция не возвращает значение, и поэтому ваша команда не определена.Voice.onSpeechResults = ...
назначает функцию этому свойству, но вы не вызываете ее здесь.3. JSON.синтаксический анализ не является асинхронным, нет смысла этого ждать.
4.
export const MicButton = async () =gt; { return new Promise((resolve) =gt; { Voice.start('en-US') Voice.onSpeechResults = async (res) =gt; { res = await JSON.parse(JSON.stringify(res)).value[0] resolve(res); } }});}
Ответ №1:
Я предполагаю здесь, но, похоже, вы хотите пообещать обратный Voice.onSpeechResults
вызов.
Пусть ваша MicButton
функция вернет обещание, которое разрешится с желаемым результатом
export const MicButton = () =gt; new Promise((resolve, reject) =gt; { Voice.start('en-US') Voice.onSpeechResults = (res) =gt; { resolve(res.value[0]) } Voice.onSpeechError = reject }).finally(() =gt; { Voice.removeAllListeners() // clean up })