【发布时间】:2021-03-14 03:00:12
【问题描述】:
附件是一个小的工作示例。我想知道当导航容器在下面的示例附近做出决定时如何执行异步代码。我知道在这段代码中没有什么让 async 变得特别,但在我的实际代码中,我有一个异步服务器获取函数。
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { Provider as PaperProvider } from 'react-native-paper';
import { createDrawerNavigator } from '@react-navigation/drawer';
var is_authorized = false
async function doSomething(){
console.log("I do something asynchronus here.")
is_authorized = !is_authorized
}
function Drawer1(){
return(
<Text>Drawer 1</Text>
)
}
function Drawer2(){
return(
<Text>Drawer 2</Text>
)
}
function LoginScreen(){
return(
<Text>LoginScreen</Text>
)
}
export default function App() {
return (
<PaperProvider>
<NavigationContainer>
{is_authorized ? (
<Drawer.Navigator drawerContent={props => <DrawerContent {...props} />}>
<Drawer.Screen name="Drawer1" component={Drawer1} />
<Drawer.Screen name="Drawer2" component={Drawer2} />
</Drawer.Navigator>
) : (
<LoginScreen/>
)
}
</NavigationContainer>
</PaperProvider>
);
}
换句话说,每次执行is_authorized ? (,我都想在之前执行await doSomething()。我不确定它是否相关,但我正在使用托管工作流程(expo)运行它。
编辑:我认为需要运行的异步函数是一个循环,用于检查 websocket 是否有新消息,并在等待消息时休眠。我在这里使用 await 来睡觉。
this.websocket.onmessage = function(evt) {
let json_message = JSON.parse(evt.data)
let message_id = json_message["message_id"]
this.message_dict[message_id] = json_message;
}
//...
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
//...
for (var i = 0; i < timeout*2; i++) {
if (message_id in this.websocket.message_dict){
...
}
await sleep(500)
}
【问题讨论】:
-
你能举例说明你想在异步方法中做什么吗?如果要在评估
is_autorized时运行代码,可以使用useEffect挂钩。但是在这里等待可能没有意义,因为您不应该阻止渲染。 -
我也对此感兴趣。有什么想法@nipuna777?
标签: javascript react-native asynchronous expo