Доступ к элементу массива JSON вне асинхронной функции Javascript - PullRequest
0 голосов
/ 18 мая 2018

У меня есть следующий скрипт:

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

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

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

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

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

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

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

getJobs().then(function(response){
  return response.json();
  })
  .then(function(jobs){
  console.log('result after promise chain is ' + jobs)
  }
);
0 голосов
/ 18 мая 2018

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

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

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.log(jobs);
 }
 
 run();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...