#javascript #node.js #promise
#javascript #node.js #обещание
Вопрос:
я хочу отправить уведомление пользователю после сохранения этого уведомления в базе данных.
во-первых: я хочу сохранить данные в базе данных :
во-вторых: я хочу вернуть пользователя FirstName adn lastName
async CreateNotification(item): Promise<any> {
const requestModel = new NotificationModel();
requestModel.sender = item.sender;
requestModel.reciver = item.reciver;
requestModel.notificationType = item.notificationType;
requestModel.sendDate = new Date();
return requestModel.save()
.then((data) => {
this.GetNOtificationById(data)
.then(data=>{
return data;
})
});
}
async GetNOtificationById(data) {
let item = await NotificationModel
.findOne({ sender: data.sender, reciver: data.reciver, notificationType: data.notificationType })
.populate({ path: 'sender', select: "firstName lastName" }).exec();
return item;
}
третье: я хочу вернуть эти данные и использовать их в сокете :
socket.on('send Notificaiton', (data) => {
let item;
notificationRepository.CreateNotification(data)
.then(data => {
item = data;
})
io.sockets.in(data.reciver).emit('notification', { id: item.id, senderId: item.sender._id, notificationType: item.notificationType, senderName: item.sender.firstName ' ' item.sender.lastName });
})
но у меня проблема с этим кодом, некоторое время он работает нормально, а иногда возвращает item= null
на третьем шаге.
теперь, как я могу решить эту проблему???
Комментарии:
1. вы можете захотеть
then((data) => { return this.GetNOtificationById(data)
— и в этом никогда не будет необходимости.then(data=>{ return data; })
— это в основном NOOP — он не делает асинхронные результаты доступными синхронно2. @JaromandaX я пробовал ваш код, но он не работал
3. у вас больше проблем, чем это… приведенный ниже ответ должен заставить его работать
4. @JaromandaX это не сработало для меня, чувак
5. как я уже сказал, в вашем коде много проблем — работайте с человеком, который пытается вам помочь
Ответ №1:
Проблема в том, что вы не ждете notification creation
.
// Notication
async CreateNotification(item): Promise<any> {
try {
const requestModel = new NotificationModel();
requestModel.sender = item.sender;
requestModel.reciver = item.reciver;
requestModel.notificationType = item.notificationType;
requestModel.sendDate = new Date();
const data = await requestModel.save()
const result = await this.GetNOtificationById(data)
return result
} catch(err) {
console.log(err)
throw err
}
}
socket.on('send Notificaiton', async (data) => {
try {
const item = await notificationRepository.CreateNotification(data)
if (item) {
io.sockets.in(data.reciver).emit('notification', { id: item.id, senderId:
item.sender._id, notificationType: item.notificationType, senderName:
item.sender.firstName ' ' item.sender.lastName });
} else {
console.log('Item does not exist', item)
}
} catch (err) {
console.log('Error while creating item: ', err)
}
Комментарии:
1. Можете ли вы проверить сейчас!
2. вам нужно выяснить, почему элемент не создан,
3. в первый раз он показывает мне это
null
сообщение, а в другой пытается найти, что сработало.4. Почему вы звоните
GetNOtificationById
послеsave
, почему вы не можете вернуть элемент, который естьcreated
?5. Пришлось бы догадаться, что
requestModel.save()
это не возвращает соответствующее обещание.