【发布时间】:2014-10-23 11:47:07
【问题描述】:
这就是我想要做的。我需要对 JSON 对象进行一些预处理。为此,我需要遍历每个元素,如果没有新人的 id 则为新人做一个承诺,然后更新列表中的那个元素。
例子:
participant:[{
person:{
firstName: 'john'
lastName: 'Doe'
},
role: 'Plumber'
}, {
person: '12345a9j09kf23f3'
role: 'Window Washer'
}]
第一个元素没有人员 ID,因此我将创建一个承诺,在数据库中创建人员,然后更新该元素并将“John Doe”替换为人员 ID。第二个元素已经有了id,不需要去数据库创建新人了。
此代码按原样工作。问题是我正在尝试做一个 for 循环,我需要一个同步的承诺。我有麻烦了。如何使用循环并调用 promise 或有条件地不处理 promise 并且逻辑同步工作?
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
【问题讨论】:
-
使用异步操作时,逻辑不能同步工作。您必须为异步响应编写代码。累积一个 Promise 列表,然后使用
Q.all()之类的东西来监视所有 Promise 并在它们全部完成后调用您的回调。 -
你不应该这样做,因为
loop和push是同步操作
标签: javascript node.js promise q