У меня есть такой сценарий:
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 был один раз, а затем я хочу делать вещи с массивом заданий в приложении.
Возможный дубликат Как мне вернуть ответ от асинхронного вызова?
Если вы возвращаете значение из своей функции, т.е. return json; ?



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


Вам нужно создать еще одну асинхронную функцию, в которой вы вызываете 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 и невозможно.
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, находящийся за пределами любой другой функции.
Без проблем. Фактически вы можете просто установить jobs = getJobs (). Then (). Then (). Переменная ваших заданий будет обновляться каждый раз, когда обещание будет выполнено. Вам просто нужно знать, что до тех пор, пока оба Promsies не будут разрешены, задания будут объектом Promise и, возможно, потребуется проверить его тип, прежде чем фактически использовать его.
jobs = await getJobs();