我想对我使用环回设计的 API 之一进行同步调用。这是我的代码:
router.get('/friends', function(req, res, Array) {
var friendsList = []
for(var counter=0;counter<length;counter++){
Model.findById(Array[counter].Id,function(err, record) {
if(record){
friendsList.push(record);
}
});
}
res.status(200).json(friendsList);
});
现在我在数组之前收到响应,friendList 已完全填充。我想让这个同步并得到正确的响应。我该怎么办?
谢谢!
最佳答案
一个简单的方法是
- 将变量设置为
长度
- 每次调用回调时,将此变量减少 1
- 当它达到零时,您已经处理了最终回调
- 在回调中,调用
res.status...
像这样:
router.get('/friends', function(req, res, array) {
var friendsList = [];
var remaining = length;
for(var counter=0;counter<length;counter++){
Model.findById(array[counter].Id, function(err, record) {
if (record){
friendsList.push(record);
}
remaining -= 1;
if (remaining == 0) {
res.status(200).json(friendsList);
}
});
}
});
为了完整性......因为您使用的是nodejs ...使用( native )Promise 和 arrow function
语法
router.get('/friends', (req, res, array) =>
Promise.all(array.map(item =>
new Promise((resolve, reject) =>
Model.findById(item.Id, (err, record) =>
resolve(record || undefined)
)
)
))
.then(friendsList =>
res.status(200).json(friendsList.filter(item =>
item !== undefined
))
)
);
关于javascript - 环回: Making synchronous call to loopback api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35653080/