Переменная из обратного вызова иногда пуста

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

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. Я хочу знать, почему и как решить.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

@NVO ;-) Бывает

Ankit Agarwal 02.07.2018 13:14

Другие вопросы по теме