У меня есть функция, которая возвращает случайный цвет в обратном вызове, например:
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. Я хочу знать, почему и как решить.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Причина - случайное число:
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 ;-) Бывает