React Javascript等待直到完成

时间:2019-11-04 22:53:42

标签: javascript reactjs react-native async-await

当我从AsyncStorage获取数据时,它不会等待显示

在获取值之前返回值。

我不能在函数上使用异步等待。如果是这样,它将无法编译。

我今天整天都在搜索,但找不到答案。

我如何解决这个简单但对我来说很复杂的问题?

反应码

import random
def user_guess_validation():
    guess = input('Enter your guess. Numbers seperated by a space: ')
    x = guess.split() #splitting input and creating a list

    if len(x) == 4: # making sure input lenght is 4
        lst = []
        for each in x:
            if each.isdigit() == True and int(each) in range(1,10): #checking if item in list is actually a number between 1 and 9 
                lst.append(int(each))
                print('1, the lst here is', lst)
                continue
            else:
                print("1 Sorry, that's an invalid entry. Your guess must be 4 UNIQUE digits seperated by space.")
                user_guess_validation()
        for i in range(4): # checking if each input is unique

            for j in range(i+1,4):
                print('2, the lst here is', lst)
                if lst[i] == lst[j]:
                    print('index of i and j is: ',lst[i],lst[j])
                    print("2 Sorry, that's an invalid entry. Your guess must be 4 UNIQUE digits seperated by space.")

                    user_guess_validation()
        print('3, the lst here is', lst)
    else:
        print("3 Sorry, that's an invalid entry. Your guess must be 4 UNIQUE digits seperated by space.")
        user_guess_validation()


def main():
    secret_code = random.sample(range(1,10),4)
    print(secret_code)
    validated_guess = user_guess_validation()
    print(validated_guess)


    if validated_guess == secret_code:
        print('Correct!')
    else:
        print('Wrong! Try again.')
        user_guess_validation()

main()

1 个答案:

答案 0 :(得分:1)

(免责声明-我熟悉React的网络版本,但我猜想这些模式在React-native方面如果不相同,则是相似的。)

您正在尝试在同步操作(DisplayUsername)中执行异步操作(render)。 React不允许渲染异步。您的呈现函数始终需要返回React可以理解的内容(UI元素或空值,例如null或空数组)。

这意味着您的组件具有两种状态:一种状态尚不知道用户名是什么,以及一种状态已完成使用AsyncStorage并且知道用户名。这表明您可以使用react state来保存用户名数据。

在React中获取外部数据的“标准”方法是使用组件的componentDidUpdate方法(在组件首次呈现后触发)或带有功能组件的useEffect钩子(每次渲染后都会触发)。这就是您要实现的:

  1. 组件在没有用户名的情况下首次呈现。也许它显示了一个加载器元素?
  2. 组件从AsyncStorage异步获取用户名
  3. 收到结果后,更新组件状态
  4. 状态更改始终会触发重新渲染,因此现在您可以使用用户名进行渲染

以下是使用功能组件实现这些步骤的伪代码:

export default HomeScreen = ({ navigation }) => {
    // set up state and setter for username state
    const [username, setUsername] = useState('');
    // effect hook for fetching username
    useEffect(() => {
      doSomethingToGetUsername().then(result => {
        setUsername(result);
      }).catch(error => {
        console.log(error);
      });
    }, [username]);

    const usernameTxt = ` ${username}` || '';

    return (
        <View style={styles.container}>
            <TouchableOpacity onPress={() => { navigation.navigate('Friends') }}>
                <Text>Welcome{usernameTxt}</Text>
                <Text>Click Here</Text>
            </TouchableOpacity>
        </View>
    )
}