Как использовать переменную вне ее области в 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);
    });
Другие вопросы по тегам