Самый простой способ сделать это с помощью Promises и async / await - делает код очень чистым по сравнению с использованием обратных вызовов, которые проверяют, есть ли еще что-то для обработки
Итак, во-первых, если вы «обещаете» * Функции 1003 * и getShiftsForUser
, основные l oop удивительно просты!
Кроме того, создание функций, которые обрабатывают .save
и возвращают Promise, также упрощает
worker.on('message', async (data) => {
// note the "async" in the above
// the Promisified functions
const makeNewShift = (Email, Shifts) => new Promise((resolve, reject) => {
const newShift = new db.rota({ Email, Shifts });
newShift.save((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
const updateShifts = shiftData => new Promise((resolve, reject) => shiftData.save((err) => {
if (err) {
reject(err);
} else {
resolve();
}
}));
const getShiftsForUser = email => new Promise((resolve, reject) => db.rota.getShiftsForUser(email, (err, shiftData) => {
if (err) {
reject(err);
} else {
resolve(shiftData);
}
}));
const checkUserHasShifts = email => new Promise(resolve => db.rota.checkUserHasShifts(email, resolve));
// Now on to the logic
console.log(data);
for (let i of data.entries) {
console.log(i.Email);
const flag = await checkUserHasShifts(i.Email);
if (flag) {
console.log('e', i.Email);
const shiftData = await getShiftsForUser(i.Email);
if (shiftData) {
shiftData.Shifts = i.Shifts;
await updateShifts(shiftData);
}
} else {
console.log('n', i.Email);
await makeNewShift(i.Email, i.Shifts);
}
};
console.log("Spreadsheet processed");
})