环回:对环回 API 进行同步调用
Loopback : Making synchronous call to loopback api
我想对我使用环回设计的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 正在完全填充。我想使它同步并获得正确的响应。我该怎么办?
谢谢!
一个简单的方法是
- 将变量设置为
length
- 每次调用回调时,将此变量减少 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...使用(本机)承诺和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
))
)
);
我会使用async
和underscore
模块
var async = require('async');
var _ = require('underscore');
router.get('/friends', function(req, res, Array) {
var friendsList = [];
var waterfallFunctions = [];
_.each(Array, function(element) {
waterfallFunctions.push( function(next) {
Model.findById(element.Id,function(err, record) {
if (err) return next(err);
if(record){
friendsList.push(record);
}
next();
});
});
});
//async waterfall calls the functions in the array in order.
async.waterfall(waterfallFunctions, function (err) {
if (err) return res.status(500);
res.status(200).json(friendsList);
});
});
在 Mongoose 中使用 Promise 和 $in
运算符:
router.get('/friends', function(req, res, arr) {
var promise = Model.find({ _id: { $in: arr.slice(0, length).map(function (e) { return e.Id }) } }).exec()
promise.then(function (friendsList) {
res.status(200).json(friendsList)
})
})
arr.slice
从数组中选取前 length
个元素。 Model.find
创建单个查询,这比执行多个findById
查询更有效。 $in
运算符接受要对其执行查找的 id 数组。 .exec()
创建一个承诺,该承诺通过.then(...)
解决。
你应该等到 N findById 调用完成,所以解决方案是做出一系列承诺并使用 Promise.all 方法。
router.get('/friends', function(req, res, Array) {
var friendsList = []
var friendsPromises = []
for (var counter=0; counter<length; counter++) {
var friend = Model.findById(Array[counter].Id;
friendsList.push(friend)
friend.then(function(record) {
if (record) {
friendsList.push(record);
}
})
}
Promise.all(friendsPromises).then(function(){
res.status(200).json(friendsList);
})
});
相关文章:
- 同步调用,直到用户通过angular验证为访问者
- 如何使用javascript中的生成器模拟同步调用
- 通过同步调用检查用户是否存在
- Node.js同步调用passport本地注册
- 在同步调用之前先调用函数
- 对async函数进行同步调用
- 节点.js与 ASYC 瀑布模块同步调用
- 如何在节点/环回中同步调用 model.find 方法
- 异步进程上的同步调用
- 从 javascript 同步调用 Struts 2 操作
- 环回:对环回 API 进行同步调用
- JavaScript 同步调用
- Javascript方法同步调用,没有回调和$.ajax
- Javascript 同步调用与更新
- EXT-js如何同步调用Store
- AngularJs:$http同步调用
- phonecap对文件系统的同步调用
- javascript/nodejs:在大的、分块的数据集上同步调用一组类似的异步函数会导致内存泄漏
- Meteor同步调用函数
- 在nodejs中,是否有更好的设计模式来同步调用异步函数