Почему функция не ожидается как обещание?

#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 })