Вот что я пытаюсь сделать. Мне нужно сделать предварительную обработку объекта JSON. Чтобы сделать это, мне нужно пройти через каждый элемент, выполнить обещание для нового человека, если для этого человека нет идентификатора, а затем обновить этот элемент в списке.Понимание Javascript Promises - Просто хочу пояснения
Пример:
participant:[{
person:{
firstName: 'john'
lastName: 'Doe'
},
role: 'Plumber'
}, {
person: '12345a9j09kf23f3'
role: 'Window Washer'
}]
Первый элемент не имеет лица идентификатор, так что я собираюсь создать обещание, создать человека в базе данных, а затем обновить этот элемент и заменить «John Doe 'с personId. Второй элемент уже имеет идентификатор и не нужно заходить в базу данных для создания нового человека.
Этот код работает так, как есть. Проблема в том, что я пытаюсь сделать цикл for, и мне нужно синхронное обещание. У меня проблемы. Как я могу использовать цикл и иметь обещание называется или условно не обрабатывать обещание, а логика работает синхронно?
Box.create(box)
.then(function(data) {
_.forEach(participants, function (participant) {
//This promise will be executed asynchronously, possible to make it synchronous with the for loop?
if (typeof participant.person != 'undefined' && typeof participant.person.firstName != 'undefined') {
Person.create(participant.person).then(function (data) {
return Participant.create({}).then(function(data){
newParticipants.push(data);
})
});
} else {
participants.push(participant);
}
});
return Q(undefined);
}).then(function(){
// more logic
Логика не может работать синхронно при использовании асинхронных операций. Вы должны ввести код для асинхронных ответов. Накопите список обещаний, а затем используйте что-то вроде 'Q.all()' для контроля всех обещаний и вызова своего обратного вызова, когда все будет сделано. – jfriend00
Вы не должны этого делать, потому что 'loop' и' push' являются синхронными операциями – monkeyinsight