Поскольку ваша функция request
равна async
, вам нужно обработать ее результат как Promise
.
Это также причина, по которой вы видите, что он представлен по-разному в chrome консоли. Пустой массив печатается, но ссылки в консоли обновляются динамически, поэтому вы все равно можете развернуть его и просмотреть содержимое.
Если вы хотите записать содержимое массива статически, вы можете использовать что-то вроде JSON.stringify
, чтобы распечатать его. Это напечатает строковое представление точного состояния массива во время регистрации.
// You will need to check the output in the browser console.
// Your code could be reduced to this:
const a = [];
setTimeout(() => a.push(1, 2), 100);
console.log('a:', a);
// A filled array logs differently:
const b = [1, 2];
console.log('b:', b);
// Stringify gives you a fixed state:
const c = [];
setTimeout(() => c.push(1, 2), 100);
console.log('c:', JSON.stringify(c));
Что касается вашего кода, помимо ожидания request()
, если вы используете map
, вы должны воспользоваться тем, как он работает . Вы можете использовать его для генерации всего массива, не используя, например, push
. Если вы все еще хотите использовать свой массив и push()
к нему, вам следует использовать json.data.forEach
вместо json.data.map
, поскольку он не дублирует массив.
// Making your function `async` so you can `await` for the `request()`
let loadInitialImages = async ($) => {
let html = "";
const APIURL = "https://api.shutterstock.com/v2/images/licenses";
const request = async () => {
const response = await fetch(APIURL, { headers: auth_header() } );
const json = await response.json();
// Array.map will return a new array with the results of applying
// the given function to the original array, you can use that as
// an easy way to return your desired array.
return json.data.map((v) => v.image.id);
}
// Since request() is async, you need to wait for it to complete.
const images = await request();
// Array.forEach lets you iterate over an array without generating a
// copy. If you use map here, you would be making an unneeded copy
// of your images array.
images.forEach(i => console.log(i));
}