Edit2: решение внизу
Я использую Chrome-консоль и пытаюсь вывести извлеченные данные, и я получаю желаемый результат, только написав «await» в нужном месте, даже если другое решение может сделать это раньше, а я нет знать, почему / как это работает.
solution () - это «официальное» решение веб-курса, которым я занимаюсь. В настоящее время обе функции возвращают одно и то же. В myFunction я пытался написать «await» перед каждой используемой функцией и сделать каждую функцию «асинхронной», но я все еще не могу заменить «await» внутри журнала, хотя другое решение может.
const urls = ['https://jsonplaceholder.typicode.com/users']
const myFunction = async function() {
// tried await before urls/fetch (+ make it async)
const arrfetched = urls.map( url => fetch(url) );
const [ users ] = arrfetched.map( async fetched => { //tried await in front of arrfetched
return (await fetched).json(); //tried await right after return
});
console.log('users', await users); // but can't get rid of this await
}
const solution = async function() {
const [ users ] = await Promise.all(urls.map(async function(url) {
const response = await fetch(url);
return response.json();
}));
console.log('users', users); // none here, so it can be done
}
solution();
myFunction();
Я думаю, что "ожидание" работает таким образом, что:
const a = await b;
console.log(a); // this doesn't work
так же, как
const a = b;
console.log(await a); // this works
но это не так, и я не понимаю, почему нет. Я чувствую, что Promise.all делает что-то неожиданное, поскольку просто написать «await» в объявлении нельзя, только после объявления.
Edit1: это не работает
const myFunction = async function() {
const arrfetched = await urls.map( async url => await fetch(url) );
const [ users ] = await arrfetched.map( async fetched => {
return await (await fetched).json();
});
console.log('users', users);
}
Edit2: Спасибо за помощь всем , я пытался поставить ".toString ()" на многие переменные и переключаться там, где я вставил "await" в код и где не.
Насколько я понимаю, если я не использую Promise.all, тогда мне нужно ждать каждый раз, когда я хочу использовать (как в реальных данных, а не просто использовать) функцию или переменную, которая имеет обещания . Недостаточно только ждать, когда данные будут обрабатываться, а не подниматься дальше.
В приведенном выше редакторе Edit1 пользователи запускаются до завершения любого другого ожидания, поэтому независимо от того, сколько я ожидаю записи, ни одно из них не выполняется. Копирование этого кода в (в моем случае chrome-) консоль прекрасно демонстрирует это:
const urls = [
'https://jsonplaceholder.typicode.com/users',
]
const myFunction = async function() {
const arrfetched = urls.map( async url => fetch(url) );
const [ users ] = arrfetched.map( async fetched => {
console.log('fetched', fetched);
console.log('fetched wait', await fetched);
return (await fetched).json();
});
console.log('users', users);
console.log('users wait', await users);
}
myFunction();
// Output in the order below:
// fetched()
// users()
// fetched wait()
// users wait()