首页 > 解决方案 > 如何等待函数执行然后去下一个javascript

问题描述

我有一个2功能,

在我的内部,我runConfigComplianceDeviceOnClick正在调用该getDeviceRunningCompliance函数来获取其他一些数据,并且基于这两个结果我必须返回一个对象,

但是我从getDeviceRunningCompliance(Axios 请求获取数据)函数中观察到的数据没有返回,它执行下一行,

但是当我在控制台中看到值更新时,

这种情况如何处理,

如何等待函数执行然后去下一个javascript?想要处理异步数据然后继续下一行......

/**
 * @param {*} graphTable
 */
const runConfigComplianceDeviceOnClick = graphTable => {
    let selectedDevices = graphTable.dTable.store.state.selectedRowsData;
    let paramSelectedDevices;
    let filteredSelectedDevices;
    let finalParam;
    let supportedDevices = true;

    let some = getDeviceRunningCompliance(selectedDevices);
    console.log("getDeviceRunningCompliance some ", some)
    if (some.length) {
        filteredSelectedDevices = selectedDevices.map(function(device, index) {
        console.log("getDeviceRunningCompliance some filteredSelectedDevices", some)
        if (notSupportedFamilies.includes(device.series)) {
            // console.log(i18n.no_support_available_for_aireos);
            supportedDevices = false;
        } else {
            // console.log(i18n.label_configuration_data_not_available);
            supportedDevices = true;
        }

        let valsss = some.find(x => x.id === device.id);
        console.log("valsss ", valsss)
        return {
            id: device.id,
            hostname: device.hostname,
            val: device.complianceStoreStatus.complianceStatus,
            collectionStatus: device.collectionStatus,
            series: device.series,
            supportedDevices: supportedDevices
        };
    });

    finalParam = filteredSelectedDevices.filter(function(val, index) {
        return val.supportedDevices && val.val === "NON_COMPLIANT"; // this should be enable
    });
    paramSelectedDevices = JSON.stringify(finalParam);

    localStorage.setItem("selectedDevicesConfigSync", paramSelectedDevices);
    if (selectedDevices.length !== finalParam.length) {
        toast({
            message: finalParam.length + i18n.device_out_of_sync_for_start_vs_run,
            flavor: "warning",
            label: i18n.toast_header_running_configuration
        });
    }
    shell.router.push(`/dna/provision/configuration-compliance`);
    }
    
};

const getDeviceRunningCompliance = (selectedDevices) => {
    let self = this;
    let deviceRunningComplaince = [];
    selectedDevices.forEach((val, index) => {
        let obj = {};
        getComplianceDetails(val.id).then(data => {
            const complianceDetailsData = data;
            if (complianceDetailsData) {
                // this.setState({
                //  complianceDetailsData: data
                // });
                let cardStatus;
                let complianceApiDataForConfig =
                    complianceDetailsData && complianceDetailsData.filter(config => config.complianceType === "RUNNING_CONFIG");
                cardStatus =
                    complianceApiDataForConfig && complianceApiDataForConfig.length && complianceApiDataForConfig[0].status;
                obj.id = val.id;
                obj.runningStatus = cardStatus;
                deviceRunningComplaince.push(obj);
                // return cardStatus;
            }
        });
        
        // deviceRunningComplaince.push(obj);
    });
    return deviceRunningComplaince;
};

标签: javascript

解决方案


这就是我解决这个问题的方法。如果我们可以做得更好,请发表评论。

/**
 * @param {*} graphTable
 */
const runConfigComplianceDeviceOnClick = graphTable => {
    let selectedDevices = graphTable.dTable.store.state.selectedRowsData;
    let paramSelectedDevices;
    let filteredSelectedDevices;
    let finalParam;
    let supportedDevices = true;

    getDeviceRunningCompliance(selectedDevices).then(function(some) {
        if (some.length) {
            filteredSelectedDevices = selectedDevices.map(function(device, index) {
                console.log("getDeviceRunningCompliance some filteredSelectedDevices", some);
                if (notSupportedFamilies.includes(device.series)) {
                    // console.log(i18n.no_support_available_for_aireos);
                    supportedDevices = false;
                } else {
                    // console.log(i18n.label_configuration_data_not_available);
                    supportedDevices = true;
                }

                let valsss = some.find(x => x.id === device.id);
                console.log("valsss ", valsss);
                return {
                    id: device.id,
                    hostname: device.hostname,
                    val: device.complianceStoreStatus.complianceStatus,
                    collectionStatus: device.collectionStatus,
                    series: device.series,
                    supportedDevices: supportedDevices
                };
            });

            finalParam = filteredSelectedDevices.filter(function(val, index) {
                return val.supportedDevices && val.val === "NON_COMPLIANT"; // this should be enable
            });
            paramSelectedDevices = JSON.stringify(finalParam);

            localStorage.setItem("selectedDevicesConfigSync", paramSelectedDevices);
            if (selectedDevices.length !== finalParam.length) {
                toast({
                    message: finalParam.length + i18n.device_out_of_sync_for_start_vs_run,
                    flavor: "warning",
                    label: i18n.toast_header_running_configuration
                });
            }
            shell.router.push(`/dna/provision/configuration-compliance`);
        }
    });
};

const getDeviceRunningCompliance = selectedDevices => {
    let promiseData = selectedDevices.map((val, index) => {
        return getComplianceDetails(val.id).then(data => {
            let obj = {};
            const complianceDetailsData = data;
            if (complianceDetailsData) {
                let cardStatus;
                let complianceApiDataForConfig =
                    complianceDetailsData && complianceDetailsData.filter(config => config.complianceType === "RUNNING_CONFIG");
                cardStatus =
                    complianceApiDataForConfig && complianceApiDataForConfig.length && complianceApiDataForConfig[0].status;
                obj.id = val.id;
                obj.runningStatus = cardStatus;
                return obj;
            }
        });
    });
    return Promise.all(promiseData);
};

推荐阅读