У меня есть код ниже, который делает запрос на возврат всех запланированных сообщений до этого момента, и если они есть, он обновляет каждый документ в «запланированной» коллекции с новой датой (увеличивая ее значение в соответствии с полем повторения),и если обновление этого документа выполнено, он вставляет новый документ в коллекцию "msgs".
Проблема в том, что я сделал слишком сложный код, и он вставляет дублированные сообщения в конце.Я подозреваю, что функция "insertScheduledMsgs" вызывается снова до того, как завершится асинхронный запрос на обновление "запланированного" документа внутри цикла, поэтому при следующем вызове функции у документа расписания все еще будет старая дата.
Как мне сделать это проще и исправить эту проблему?
Ниже вы можете увидеть весь код:
function insertScheduledMsgs() {
request.get( {
headers: { 'Authorization':'Bearer ' + token },
url: urlApi + "scheduleBeforeOrAfterNow?msgsPosition=before"
}, function( error, response, body ){
if ( !error && response.statusCode == 200 ) {
results = JSON.parse( body );
for ( let res in results ){
let bodyMsg = "",
bodySchedule = "",
log,
scheduleDate = (Number( results[res].date ) + ( Number( results[res].repeat ) * 60 * 1000)),
date1 = new Date(results[res].date),
date2 = new Date();
bodyMsg += 'user=' + results[res].user;
if ( results[res].media ) {
bodyMsg += '&media=' + results[res].media;
}
bodyMsg += '&txt=' + results[res].txt;
bodyMsg += '&time=' + results[res].time;
bodyMsg += '&layout=' + results[res].layout;
bodyMsg += '&boxes=' + results[res].boxes;
bodySchedule += '_id=' + results[res]._id;
bodySchedule += '&date=' + scheduleDate;
if( date1.setSeconds(0,0) <= date2.setSeconds(0,0) ) {
request.put( {
headers: { 'content-type' : 'application/x-www-form-urlencoded', 'Authorization':'Bearer ' + token },
url: urlApi + "schedule",
body: bodySchedule
}, function( errorSchedule, responseSchedule, body ){
logs({
event: "date updated in scheduled msg",
date: new Date().getTime()
}, token);
if( date1.setSeconds(0,0) === date2.setSeconds(0,0) ) {
request.post( {
headers: { 'content-type' : 'application/x-www-form-urlencoded', 'Authorization':'Bearer ' + token },
url: urlApi + "msgs",
body: bodyMsg
}, function( errorMsg, responseMsg, body ){
logs({
event: "scheduled msg sent to monitor / tv",
date: new Date().getTime()
}, token);
if ( (Number(res) + 1) === results.length ) {
insertScheduledMsgs();
}
} );
} else {
if ( (Number(res) + 1) === results.length ) {
insertScheduledMsgs();
}
}
} );
} else {
if ( (Number(res) + 1) === results.length ) {
insertScheduledMsgs();
}
}
};
} else {
insertScheduledMsgs();
}
} );
};