繁体   English   中英

函数的意外未定义返回值

[英]Unexpected undefined return value from a function

我从函数中获得了意外的不确定的返回值。

function createselbox(arr) {
    console.log('In createselbox');
    var startstr = `Something`;
    mytemp = '';
    for (var i = 0; i < arr.length; i++) {
        mytemp = mytemp + '<option>' + arr[i] + '</option>';
    }
    var ret = startstr + mytemp + `Something else    `;
    IsStaff = CheckifStaff();
    console.log('Checkifstaff is ' + IsStaff);
    if (IsStaff) {
        console.log('Got true createselbox');
        console.log('In sel loop');
        ret = startstr + mytemp + `Something more`;
    } else {
        console.log('Got false createselbox');
    }
    return ret;
}

function CheckifStaff() {
    var data = {
        "isstaff": 'check'
    };
    data = $(this).serialize() + "&" + $.param(data);
    $.ajax({
        type: "POST",
        dataType: "html",
        url: "/functions/checkifstaff",
        data: data,
        success: function (data) {
            var recdata = data;
            if (recdata.indexOf('Has add permissions') != -1) {
                console.log('Returning true');
                return 1;
            } else {
                console.log('Returning false');
                return 0;
            }
        },
        error: function (xhr, textStatus, errorThrown) {
            console.log('An error occured in CheckifStaff');
            return 0;
        }
    });
}

控制台显示:

In createselbox
appointment.js ? dev = 96168005 : 292 Checkifstaff is undefined
appointment.js ? dev = 96168005 : 305 Got false createselbox
appointment.js ? dev = 96168005 : 158 Returning true

首先调用createselbox。 但是,显然甚至在函数执行之前,该函数的值也将返回为false。

为什么会这样呢?

CheckifStaff()没有显式的return语句,因此它返回默认情况下所有函数返回的内容( undefined

为了使这项工作, CheckiStaff需要返回的东西,在这里,例如CheckiStaff会返回一个承诺,其价值为1个或0。 createselbox现在将await CheckiStaff ,然后使用它以后返回值

 async function createselbox(arr) { console.log('In createselbox'); var startstr = `Something`; mytemp = ''; for (var i = 0; i < arr.length; i++) { mytemp = mytemp + '<option>' + arr[i] + '</option>'; } var ret = startstr + mytemp + `Something else `; let IsStaff = await CheckiStaff(); console.log('Checkifstaff is ' + IsStaff); if (IsStaff) { console.log('Got true createselbox'); console.log('In sel loop'); ret = startstr + mytemp + `Something more`; } else { console.log('Got false createselbox'); } return ret; } function CheckifStaff() { var data = { "isstaff": 'check' }; data = $(this).serialize() + "&" + $.param(data); return new Promise((resolve, reject) => { $.ajax({ type: "POST", dataType: "html", url: "/functions/checkifstaff", data: data, success: function (data) { var recdata = data; if (recdata.indexOf('Has add permissions') != -1) { console.log('Returning true'); resolve(1); } else { console.log('Returning false'); resolve(0); } }, error: function (xhr, textStatus, errorThrown) { console.log('An error occured in CheckifStaff'); resolve(0); } }); }); } 

您也可以将您的ajax更改为这样

 $.ajax({
    type: "POST",
    dataType: "html",
    url: "/functions/checkifstaff",
    data: data,
    success: function (data) {
        var recdata = data;
        if (recdata.indexOf('Has add permissions') != -1) {
            console.log('Returning true');
            return 1;
        } else {
            console.log('Returning false');
            return 0;
        }
    },
    error: function (xhr, textStatus, errorThrown) {
        console.log('An error occured in CheckifStaff');
        return 0;
    }
}).then(function(data){
   return data
});

我不是专家,但是我认为当您使用Ajax时,您应该等待响应-使用Promise或async / await func

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM