переменная из обратного вызова иногда пуста - PullRequest
0 голосов
/ 02 июля 2018

У меня есть функция, которая возвращает случайный цвет в обратном вызове, например:

function getRandomColor(callback) {

    var colors = [
        'greyblue',
        'lightblue',
        'blue',
        'lightgreen',
        'darkgreen',
        'purple',
        'pink',
        'red',
        'yellow',
        'brown'
    ];

    var random = Math.floor(Math.random() * colors.length+1);
    var color = colors[random];

    return callback(color);
}

Эта функция вызывается в другой функции, которой требуется значение из обратного вызова. Но color от обратного вызова иногда пусто. Кто-нибудь может объяснить, почему это происходит? Я использую функцию обратного вызова, чтобы на самом деле предотвратить пустое значение, но похоже, что оно не является водонепроницаемым решением.

function createCategory(name, access_token, callback){
    getRandomColor(function(color){
        countr.callApi(
            {
                url: 'categories', 
                method: 'POST'
            }, {
                name: name, 
                visible: true, 
                color: color 
            }, 
            access_token, 
            function(err, category){
                return callback(err, category);
            }
        )
    })
}

Поскольку используемому API-интерфейсу требуется цвет для категории (которую мы хотим создать), этот вызов завершится ошибкой, поскольку color is undefined. Я хочу знать, почему и как решить.

1 Ответ

0 голосов
/ 02 июля 2018

Причина в случайном числе:

var random = Math.floor(Math.random() * colors.length+1);

Он будет генерировать случайное число от 0 до colors.length+1, где colors.length равно 10, поэтому он будет генерировать случайные числа от 0-10, а если случайное число равно 10, то colors[random]; даст вам undefined, поскольку в индексе 10 массива colors нет элемента. Таким образом,

var color = colors[random]; //undefined
return callback(color);  //callback has value undefined

Чтобы исправить это, измените код на

var random = Math.floor(Math.random() * colors.length);

, который будет генерировать случайные числа только между 0-9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...