Как асинхронно записать файл JSON из массива? - PullRequest
0 голосов
/ 17 февраля 2020

Я собираю некоторые данные и помещаю их в любой массив, из которого они записаны в файл JSON. В настоящее время он записывает в файл JSON после каждого pu sh в массив th ...

    const myArray = [];
    const htmlString = await rp(url);
    $('a','#atozindex', htmlString).map(async (index, element) => {
        let link = $(element).attr('href');
        if (link) {
            //Do something
            myArray.push({ item1, item2, item3 });
            fs.writeFile("./arrayContents.json", JSON.stringify(myArray), function(err) {
                if(err) {
                    console.log(err);
                }
                console.log("Some Message");
            });
        }
    });
    return myArray;

Я хочу иметь его pu sh только один раз в самом конце, когда все данные уже в массиве. Итак, что-то вроде этого:

    const myArray = [];
    const htmlString = await rp(url);
    $('a','#atozindex', htmlString).map(async (index, element) => {
        let link = $(element).attr('href');
        if (link) {
            //Do something
            myArray.push({ item1, item2, item3 });
        }
    });
    fs.writeFile("./arrayContents.json", JSON.stringify(myArray), function(err) {
        if(err) {
            console.log(err);
        }
        console.log("Some Message");
    return myArray;

Но у меня возникли проблемы с его выяснением.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Мой асинхронный / ожидание ржавый, чтобы проверить, но я думаю, у вас есть 2 варианта - ждать все асинхронные:

const myArray = [];
const htmlString = await rp(url);
$('a','#atozindex', htmlString).map(async (index, element) => {
    let link = $(element).attr('href');
    if (link) {
        //Do something
        myArray.push({ item1, item2, item3 });
    }
}).forEach(pending => await pending);
fs.writeFile("./arrayContents.json", JSON.stringify(myArray), function(err) {
    if(err) {
        console.log(err);
    }
    console.log("Some Message");
return myArray;

ИЛИ, удалить асинхронный c:

const myArray = [];
const htmlString = await rp(url);
$('a','#atozindex', htmlString).map((index, element) => {
    let link = $(element).attr('href');
    if (link) {
        //Do something
        myArray.push({ item1, item2, item3 });
    }
});
fs.writeFile("./arrayContents.json", JSON.stringify(myArray), function(err) {
    if(err) {
        console.log(err);
    }
    console.log("Some Message");
return myArray;
0 голосов
/ 17 февраля 2020

Я думаю, что вы можете сделать это, как это

$.when(mapping()).then(function( ) { // mapping is a function for your map and until it finish then do that ...

});

ИЛИ

$.when(mapping()).done(function( ) { // mapping is a function for your map and until it finish then do that ...

    });

до тех пор, пока карта не закончится sh тогда или не закончите делать somting, вот так

Вы можете узнать больше о том, когда / тогда или сделано здесь

...