Доступ к элементу массива JSON вне асинхронной функции Javascript

У меня есть такой сценарий:

async function getJobs () {
    const response = await fetch('https://redhat.jobs/jobs/feed/json');
    json = await response.json();
    console.info("inside getJobs fuction " + json);
}

jobs = getJobs();
console.info("outside getJobs function" + jobs);

Первый console.info отображает ответ json, как я и ожидал. Однако со вторым журналом я вижу в консоли outside getJobs function[object Promise].

Я думаю, что здесь происходит то, что мне нужно ждать для запуска / завершения getJobs перед присвоением результатов переменной jobs? Или мой подход изначально неверен.

Чтобы дать больше контекста, я хочу, чтобы getJobs был один раз, а затем я хочу делать вещи с массивом заданий в приложении.

jobs = await getJobs();
Liam 18.05.2018 16:26

Возможный дубликат Как мне вернуть ответ от асинхронного вызова?

Liam 18.05.2018 16:26

Если вы возвращаете значение из своей функции, т.е. return json; ?

mshirlaw 18.05.2018 16:33
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
257
2

Ответы 2

Вам нужно создать еще одну асинхронную функцию, в которой вы вызываете getJobs () с await. Причина, по которой у вас есть outside getJobs function[object Promise], заключается в том, что console.info запускается до того, как обещание будет разрешено.

Выполнение этого способа решит вашу проблему:

async function run(){
  async function getJobs () {
      const response = await fetch('https://redhat.jobs/jobs/feed/json');
      json = await response.json();
      return(json);
  }

  jobs = await getJobs();
  console.info(jobs);
 }
 
 run();

Я хочу, чтобы для jobs была доступна за пределами функция. Опять же, это может быть связано с JS и невозможно.

Mark Locklear 18.05.2018 17:20

fetch(url) и response.json() возвращают обещание. Что вы можете сделать с Promises, так это использовать инструкцию .then(). Это позволяет вам выполнить некоторый код как только Обещание было выполнено. Что касается приведенного выше кода, вы заметите, если запустите его как есть, вы получите:

"outside getJobs function[object Promise]"
"inside getJobs fuction [object Object], [object Object], ..."

Это потому, что getJobs() возвращает обещание. Так:

jobs = getJobs();
console.info("outside getJobs function" + jobs);

Выполняет console.info() сразу после получения обещания от getJobs(). Только если это обещание решено, вы получите что-нибудь полезное, поэтому вам нужно убедиться, что вы вызываете console.info() только один раз Обещание было выполнено.

Вы можете сделать это с помощью оператора .then(). Узнайте больше о них здесь. Это позволяет обрабатывать этот код синхронно. Вам даже не нужно беспокоиться о том, чтобы сделать getJobs() асинхронным (это может немного запутать код, когда цепочка Promise отлично справляется с задачей на мой взгляд). Я бы реализовал это так:

function getJobs() {
    var result = fetch('https://redhat.jobs/jobs/feed/json');
    console.info('result inside getJobs is a Promise')
    return(result)
}

getJobs().then(function(response){
  return response.json();
  })
  .then(function(jobs){
  console.info('result after promise chain is ' + jobs)
  }
);

Отличный ответ, однако, я все еще не понимаю мой вопрос. Я хочу, чтобы массив вакансий был доступен вне какой-либо функции. Так что-то вроде: gist.github.com/marklocklear/bd0116ff14e266310864e456271a992‌ 1. Примечание. Мне нужен массив / переменная jobs, содержащая вывод json, находящийся за пределами любой другой функции.

Mark Locklear 18.05.2018 17:40

Без проблем. Фактически вы можете просто установить jobs = getJobs (). Then (). Then (). Переменная ваших заданий будет обновляться каждый раз, когда обещание будет выполнено. Вам просто нужно знать, что до тех пор, пока оба Promsies не будут разрешены, задания будут объектом Promise и, возможно, потребуется проверить его тип, прежде чем фактически использовать его.

jmkmay 18.05.2018 17:48

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