Как выполнить эти обещания по порядку

#javascript #node.js #promise #async-await #es6-promise

#javascript #node.js #обещание #асинхронный-ожидание #es6-обещание

Вопрос:

Итак, приведенный ниже код покажет вам, что я пытаюсь прочитать athelets и departments из файла.

У отдела есть список спортсменов, поэтому сначала я хочу сопоставить каждого спортсмена этого отдела и назначить этот список спортсменов отделу. Журналы консоли показывают следующее: представьте, что в каждом отделе по 5 спортсменов.

Итак, я хочу console.log("TEST_1") , чтобы печатать 5 раз и console.log("TEST_2") печатать 1 раз, и все это для каждого отдела.

 var array1 = [];
await Promise.all(departaments.map(async dp => {

        array1 = [];
        await Promise.all(athletes.map(async at => {

            var athlete = new Athlete();
            athlete.name = at.name;
            athlete.weight = at.weight;

            array1.push(athlete._id);
            athlete.save();
                        console.log("TEST_1");

        })).then(() => {

            var dep = new Department();
            dep.name = dp.name;
            Object.assign(dep.athletes, array1);

            dep.save();
            console.log("TEST2");
        });
    })).then(async () => {
    ............not relevant..............
}
 

Но что делает этот код: печатает все «TEST_1» и только затем «TEST_2», поэтому он размещает последние 5 спортсменов во всех отделах.

Я попытался изменить async и await , но это не сработало…

Не могли бы вы мне помочь?

Ответ №1:

Я не уверен, что понимаю, что на самом деле делает код. Также я думаю, вы пропустили, что использование «await» освобождает вас от использования .then() и .catch() от обещаний. Но я бы предположил, что вам придется изменить его на:

 var array1 = [];
await Promise.all(departaments.map(async dp => {

        array1 = [];
        await Promise.all(athletes.map(async at => {

            var athlete = new Athlete();
            athlete.name = at.name;
            athlete.weight = at.weight;

            await athlete.save();

            // maybe wait till the ORM's .save() operation provides an id?
            array1.push(athlete._id);

                        console.log("TEST_1");

        }));

        var dep = new Department();
        dep.name = dp.name;
        Object.assign(dep.athletes, array1);    

        await dep.save();

        console.log("TEST2");

    })).then(async () => {
    ............not relevant..............
}
 

Комментарии:

1. Спасибо за ваш ответ, но эта альтернатива теперь помещает всех спортсменов в каждый отдел, в файле, который я читаю, по 5 спортсменов в каждом отделе.

2. Есть только переменные «департаменты» и «спортсмены». Вы должны расширить свой первоначальный вопрос и показать нам, как выглядят переменные / файлы. Это зависит от того, как вы перебираете свои данные и когда создаете пользователей / отделы и назначаете, кто к кому.