Как использовать переменную вне ее области в Javascript?
Я хочу использовать переменную "label" за пределами ее области, как мне это сделать? Я знаю, что это не очень хорошая практика, но я все же хочу использовать значения в массиве меток. Я попытался клонировать переменную, но проблема не исчезла.
const client = new vision.ImageAnnotatorClient();
// Performs label detection on the image file
client
.labelDetection(`${filename}`)
.then(results => {
var labels = results[0].labelAnnotations;
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
})
.catch(err => {
console.error('ERROR: ', err);
});
РЕДАКТИРОВАТЬ 1: я хочу использовать метку таким образом
const client = new vision.ImageAnnotatorClient();
// Performs label detection on the image file
client
.labelDetection(`${filename}`)
.then(results => {
var labels = results[0].labelAnnotations;
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
})
.catch(err => {
console.error('ERROR: ', err);
});
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
Но консоль показывает ошибку "Невозможно использовать undefined для forEach".
2 ответа
Вы можете получить доступ к значению только с помощью .then()
, или за пределами обещания, когда вы находитесь в async
контекст:
(async () => {
const client = new vision.ImageAnnotatorClient();
const labels = client
.labelDetection(`${filename}`)
.then(results => results[0].labelAnnotations)
.catch(err => console.error('ERROR: ', err))
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
})()
Вот рабочий пример, где getLabels
заменяет ваш текущий код:
(async () => {
const fakeData = [{
labelAnnotations: [
{ description: 'label 1' },
{ description: 'label 2' },
{ description: 'label 3' },
]
}]
const getLabels = () => new Promise(r => setTimeout(r, 1000, fakeData))
const results = await getLabels()
const labels = results[0].labelAnnotations
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
})()
Просто определите labels
вне обещания:
const client = new vision.ImageAnnotatorClient();
let labels = null;
// Performs label detection on the image file
client
.labelDetection(`${filename}`)
.then(results => {
labels = results[0].labelAnnotations;
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
})
.catch(err => {
console.error('ERROR: ', err);
});
Не уверен, где вы хотите его использовать, но вы сможете использовать его значение только после того, как обещание будет выполнено. В этом случае лучшим подходом будет:
I want to use the "labels" variable beyond its scope, how can I do it ? I know its not a good practice but I still want to use the values in labels array. I tried cloning the variable but the scope issue persists
const client = new vision.ImageAnnotatorClient();
// Performs label detection on the image file
client
.labelDetection(`${filename}`)
.then(results => {
var labels = results[0].labelAnnotations;
console.log('Labels: ');
labels.forEach(label => console.log(label.description));
return labels;
})
.then(labels => {
console.error('Some other usage for labels: ', labels);
});
.catch(err => {
console.error('ERROR: ', err);
});