Как записать в глобал переменную результат асинхронного кода?

Консольлоги сделанные внутри функции показывают наполненный массив. Консольлоги сделанные снаружи функции показывают пустые массивы. Оператор await как раз ждёт пока метод .map() вернёт результат и тогда записывает его в глобал переменную dataLength. Как мне наполнить этот массив? Как я могу ретурнить результат?

const fetch = require("node-fetch");


let mainData = [];
let dataLength = [];
(async () => {
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    const json = await response.json();
    mainData = json;


     dataLength = await mainData.map(item => item.name.length);

    console.log(dataLength);
    console.log(mainData);
    // mainData.forEach(function (item, index, array) {
    //     dataLength = item.name.length;
    //     console.log(dataLength)
    // });
})();

console.log(dataLength);
console.log(mainData);

Ответы (1 шт):

Автор решения: Yugofx

То, что вы запустили async функцию сразу после создания, не значит, что ваш текущий контекст стал асинхронным. Результатом вашей самовызывающейся функции будет Promise, который когда-то будет разрезолвлен. В то время как логи вы запускаете синхронно в рамках этой же таски. Хотите провернуть ваш трюк, логируйте в .then. Если хотите сохранить результат глобально - пожалуйста. Но если хотите работать с этим результатом, это надо делать только после резолва.

const fetch = require("node-fetch");

let mainData = [];
let dataLength = [];

async function main() {
    const response = await fetch('https://jsonplaceholder.typicode.com/users');
    mainData = await response.json();


    dataLength = mainData.map(item => item.name.length);
    mainData.forEach(function (item, index, array) {
        dataLength = item.name.length;
        console.log(dataLength)
    });
}

main().then(...); // любая дальшейшая работа с данными
→ Ссылка