0

Консольлоги сделанные внутри функции показывают наполненный массив. Консольлоги сделанные снаружи функции показывают пустые массивы. Оператор 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);
d2207
  • 79

1 Answers1

2

То, что вы запустили 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(...); // любая дальшейшая работа с данными
Yugofx
  • 1,833
  • Спасибо за ответ, но это не решает мою проблему. Я логировал что бы понимать на каком этапе промис виснет. Не могу понять как мне вызвать резолв? Я вообще не понимаю ка кэто всё работает, трай\кетчи, асинк\эвейты, колбеки всё и сразу, это ту мач я не понимаю что мне использовать? Я хочу что бы функция ретурнила результат в основной поток, я бы с результатом потом работал, а она этого не делает. – d2207 Jun 10 '20 at 18:54
  • Из Вики: В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом. Выражение событийно-ориентированное говорит о том, что вы можете только реагировать на событие. Пишете вы в глобал, не пишете, не важно. Данные доступны только после события. Ваше желание продиктовано архитектурой вашего приложения. Попробуйте пересмотреть ее. – Yugofx Jun 10 '20 at 19:39
  • Так-так-так-так-так, в общем и целом переписать с использованием коллбэков. Спасибо, попробуем – d2207 Jun 10 '20 at 19:58