Javascript 为什么函数在异步存储完成之前运行

Javascript 为什么函数在异步存储完成之前运行,javascript,react-native,fetch,asyncstorage,Javascript,React Native,Fetch,Asyncstorage,我在这里有一个关于react native的问题,我在大约两周前开始了一个项目,这是我第一次尝试这个框架,从来没有使用过javascript,所以很难 我想知道的是,为什么我的函数名为“check_Authentication”,它只检查名为“Globals”的.js文件中预设了默认值的变量是否运行,然后我才能完成AsyncStorage任务,为其分配新的任务 这是我的密码 您可以看到这两个函数是AsyncStorage,在我获取一个项目或设置一个项目后,我调用另一个.js文件中名为“Updat

我在这里有一个关于react native的问题,我在大约两周前开始了一个项目,这是我第一次尝试这个框架,从来没有使用过javascript,所以很难

我想知道的是,为什么我的函数名为“check_Authentication”,它只检查名为“Globals”的.js文件中预设了默认值的变量是否运行,然后我才能完成AsyncStorage任务,为其分配新的任务

这是我的密码 您可以看到这两个函数是AsyncStorage,在我获取一个项目或设置一个项目后,我调用另一个.js文件中名为“Update_Globals”的函数,并从另一个名为“Globals”的.js文件中更新全局变量,以便以后使用它们

async function set_Async(field, value){
    try {
        await AsyncStorage.setItem(field, value);
        await update_Globals(field,value);
    } catch (error) {
    throw new Error('something wrong with setting async storage');
    }
}

async function get_Async(field){
    try {
        const value = await AsyncStorage.getItem(field);
        await update_Globals(field,value);
    } catch (error) {
        throw new Error('something wrong with getting async storage');
    }
}
下面是一个.js文件,其中包含更新上述全局变量的函数

import globals from './globals.js';

export function update_Globals(field,value){
    alert("Updating field: " + field + " with value: " + value);
    switch(field) {
        case globals.is_logged_in_name:

            globals.is_logged_in_value = value;
            break;
        case globals.account_status_name:
            globals.account_status_value = value;
            break;
        case globals.account_role_name:
            globals.account_role_value = value;
            break;
        case globals.account_user_name:
            globals.account_user_value = value;
            break;
        case globals.account_api_token_name:
            globals.account_api_token_value = value;
            break;
        case globals.account_profile_status_name:
            globals.account_profile_status_value = value;
            break;
        default:
            alert("No variable found")
    }
}
下面是带有变量的.js文件

module.exports = {
    is_logged_in_name: 'is_logged_in',
    is_logged_in_value: 'false',

    account_status_name: 'account_status',
    account_status_value: '0',

    account_role_name: 'account_role',
    account_role_value: '0',

    account_user_name: 'account_user',
    account_user_value: '0',

    account_api_token_name: 'account_api_token',
    account_api_token_value: '0',

    account_profile_status_name: 'account_profile_status',
    account_profile_status_value: 'empty',

    testing_name: "name",
    testing_value: "Chrystello",
};
而这个函数就是所有这些结合在一起的地方

async function do_Login(){
    return fetch(url, {
        method: method,
        headers: headers,
        body: JSON.stringify({
            email: email,
            password: password,
            firebase_token: firebase_token,
        })
    })
        .then(function(responseData) {
            if(responseData.ok){
                return responseData.json();
            }
            throw new Error('Network response was not ok.');

        })
        .then(function(responseData) {
            const response = responseData["response"];
            const response_array = response[0];

        set_Async(globals.account_user_name,
replace_Quote_Marks(JSON.stringify(response_array["user_id"]))).done();
        set_Async(globals.account_status_name,
replace_Quote_Marks(JSON.stringify(response_array["status_id"]))).done();
        set_Async(globals.account_profile_status_name,
replace_Quote_Marks(JSON.stringify(responseData["status"]))).done();
        set_Async(globals.account_role_name,
replace_Quote_Marks(JSON.stringify(response_array["role_id"]))).done();     
        set_Async(globals.account_api_token_name,
replace_Quote_Marks(JSON.stringify(response_array["api_token"]))).done();
        })
        .then(function () {
            try{
                check_Authentication()
            }catch(error){
                throw new Error("couln't run function");
            }

        })
        .catch(function(error) {
            console.error(error);
        });
}
在这里,您可以看到我调用set_Async()函数,我在其中发送我要存储的名称和值,在使用新值更新我的.js文件后,在完成5次更新后,我会检查每个值,然后决定用户是否可以登录,但它总是在我第一次单击按钮时返回默认值,第二次可以,因为他已经新值,因此我只能在异步存储之前判断函数check\u Authenticantion是否正在运行

函数检查验证就是这个

function check_Authentication() {
Alert.alert("I Got user " + globals.account_user_value)
if(globals.account_user_value != "0"){
    const account_status = check_Account_Status(globals.account_status_value)
    return_value = JSON.stringify(account_status["return_value"])
    if(return_value == "true"){
        screen = JSON.stringify(account_status["screen"]);
        if(screen == "ForcePassword"){
            return true;
        }
        const account_profile = check_Account_Profile(globals.account_profile_status_value)
        return_value = JSON.stringify(account_profile["return_value"])
        if(return_value == "true"){
            screen = JSON.stringify(account_profile["screen"])
            const account_role = check_Account_Role(globals.account_role_value)
            return_value = JSON.stringify(account_role["return_value"])
            if(return_value == "true"){
                screen = JSON.stringify(account_role["screen"]) + screen
                screen = replace_Quote_Marks(screen)
                return true;
            }else{
                message = JSON.stringify(account_profile["message"])
                Alert.alert(message)
                return false;
            }
        }else{
            message = JSON.stringify(account_profile["message"])
            Alert.alert(message)
            return false;
        }
    }else{
        message = JSON.stringify(account_status["message"])
        Alert.alert(message)
        return false;
    }
}else{
    Alert.alert("No User Found")
    return false;
}
}
这就是我运行main函数来触发所有事件的方式

<TouchableHighlight
    style = {styles.submit_button}
    onPress={() => {
        do_Login().done()
    }
    }>
    <Text style = {styles.submit_text}>Login</Text>
</TouchableHighlight>
{
do_Login().done()
}
}>
登录

我在附近找到了一份工作,可能不是最好的选择,但我做到了

AsyncStorage
函数中删除
wait
,使得
check\u Authentication
等待
AsyncStorage
完成设置值


感谢@SLaks为您花费的时间

不要接受这样的异常。您可以用
obj[name]替换整个setter函数=value
。使用单独的变量来保存其他变量的名称是没有意义的。您的代码实际上不是异步的,当它是异步的时候,您实际上也不是在等待它。不要同时使用
wait
then()
。替换整个setter函数。您能给出一个示例吗?