Разделение переменной на json приводит к Uncaught TypeError - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь разделить содержимое переменной pickerValue, чтобы в конечном результате отображалось только «eosptest2»

В console.log отображается pickerValue: i:0#.w|opmain\eosptest2;

Проблема заключается в том, что я получаю Uncaught TypeError: Cannot read property '0' of undefined в следующей строке:

return json[0].id.split("\\")[1];

Это функция:

function getUserNameFromPeoplePicker(pickerValue, returnType) {

    if (checkNull(pickerValue) == "") {
        return "";
    }

    var json;

    try {
        json = JSON.parse(pickerValue);
    } catch (err) {
        return replaceSubstring(pickerValue.split("\\")[1], ";", "");
    } finally {
        switch (returnType) {
            case "label":
                console.log("json[0].label: " + json[0].label);
                return json[0].label;
                break;

            case "id":
                console.log("pickerValue: " + pickerValue);
                // console.log("Json id split: " + json[0].id.split("\\")[1]);
                return json[0].id.split("\\")[1];

            default:

                return replaceSubstring(pickerValue.split("\\")[1], ";", "");
                //return replaceSubstring(json[0].value.split("\\")[1], ";", "");
                break;
        }
    }
}

Чтобы проверить это, я заменил оператор return на return "eosptest2" и все работало нормально, но я не знаю, что именно нужно изменить.

Как исправить эту проблему?

1 Ответ

1 голос
/ 29 мая 2020

Вы запускаете свои варианты переключения в предположении, что переменная json всегда определена, но если блок catch() запущен, это означает, что ваша переменная json будет неопределенной:

function example(value) {
    var json;

    try {
        json = JSON.parse(value);
    } catch (err) {
        // couldn't parse the value, so you catch an error
        console.error(err);

        return "catch";
    } finally {
        // an error got caught, this block runs regardless, and now json is undefined
        console.log(`json variable: ${json}`);
    }
}

const result = example(";");
console.log(result);

Вы также предполагаете, что если у вас есть оператор return в блоке catch(), это остановит выполнение блока finally, но это не так. правда. Блок finally выполнит свой код и только после этого вернет какой-нибудь оператор.

Также обратите внимание, что если у вас есть оператор return как в блоке catch, так и в finally, то finally Оператор return будет иметь приоритет над другим:

function example(value) {
    var json;

    try {
        json = JSON.parse(value);
    } catch (err) {
        // couldn't parse the value, so you catch an error
        console.error(err);

        return "catch";
    } finally {
        // but this return statement takes priority over catch
        return "finally";
    }
}

const result = example(";");
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...