运行 .map in JavaScript/Node.js 时如何跳过回调?
How do I skip a callback when running .map in JavaScript/Node.js?
有点像 sequel 到 ,我需要在 POST 请求中接受多个对象,然后对每个对象进行处理、保存,然后 return 保存的对象到前端(以便客户端可以看到哪些列被成功编辑)。
当我使用 .map 时,它确实保存到数据库中,我可以确认这一点。但是,我有两个问题:
- 它没有正确执行
res.locals.retval.addData(dtoObject);
,我的 returning payload 里面没有数据传输对象。
我的对象验证无法在 map
的回调内部完成。我最初尝试了 reduce
,但这根本不起作用,只是将所有相同的值保存到每个数据库对象。如何在映射时排除无效的 JSON 对象?
var jsonObjects = req.body;
//for (var n in req.body) {
var promises = jsonObjects.map((jsonObject) => {
var transform = new Transform();
// VALIDATION OF jsonObject VARIABLE IS HERE
if (jsonObject.id == 0) {
var databaseObject = Database.getInstance().getModel(objectName).build(jsonObject);
transform.setNew(true);
transform.setJsonObject(jsonObject);
transform.setDatabaseObject(databaseObject);
transform.baseExtract()
.then(() => transform.extract())
.then(() => transform.clean())
.then(() => transform.getDatabaseObject().save())
.then(function(data) {
// PROCESSING DATA
}).catch((e) => {
// ERROR
});
} else {
var queryParameters = {
where: {id: jsonObject.id}
};
console.log("Query parameters: ");
console.log(queryParameters);
Database.getInstance().getModel(objectName).findOne(queryParameters).then((databaseObject) => {
transform.setJsonObject(jsonObject);
transform.setDatabaseObject(databaseObject);
})
.then(() => transform.baseExtract())
.then(() => transform.extract())
.then(() => transform.clean())
.then(() => transform.getDatabaseObject().save())
.then((data) => {
// PROCESSING DATA
}).catch((e) => {
// ERROR
});
}
});
Promise.all(promises)
.then((results) => {
return next();
}).catch((e) => {
throw e;
});
这是生成的有效载荷:
{
"errors": [],
"warnings": [],
"data": []
}
- 正如@KevinB 在评论中所说,您缺少箭头函数内部的 return 调用,因此数据库保存正在进行,因为它们是 Promise 链的一部分,但对响应的推送是停滞等待 return,然后 Express.js 调用在 Promises 执行之前解析。将
return Database.getInstance()
和 return transform.baseExtract()
添加到您的代码中以解决此问题。
对结果数组使用 Array.prototype.filter() to remove elements you want to ignore since you won't ever need to execute Promises on them, then call Array.prototype.map()。如果不想使用箭头函数,可以将其指定为 filter
和 map
:
的参数
jsonObjects.filter(函数(jsonObject) {
}, 这个);
var promises = jsonObjects.map(函数(jsonObject) {
}, 这个);
有点像 sequel 到
当我使用 .map 时,它确实保存到数据库中,我可以确认这一点。但是,我有两个问题:
- 它没有正确执行
res.locals.retval.addData(dtoObject);
,我的 returning payload 里面没有数据传输对象。 我的对象验证无法在
map
的回调内部完成。我最初尝试了reduce
,但这根本不起作用,只是将所有相同的值保存到每个数据库对象。如何在映射时排除无效的 JSON 对象?var jsonObjects = req.body; //for (var n in req.body) { var promises = jsonObjects.map((jsonObject) => { var transform = new Transform(); // VALIDATION OF jsonObject VARIABLE IS HERE if (jsonObject.id == 0) { var databaseObject = Database.getInstance().getModel(objectName).build(jsonObject); transform.setNew(true); transform.setJsonObject(jsonObject); transform.setDatabaseObject(databaseObject); transform.baseExtract() .then(() => transform.extract()) .then(() => transform.clean()) .then(() => transform.getDatabaseObject().save()) .then(function(data) { // PROCESSING DATA }).catch((e) => { // ERROR }); } else { var queryParameters = { where: {id: jsonObject.id} }; console.log("Query parameters: "); console.log(queryParameters); Database.getInstance().getModel(objectName).findOne(queryParameters).then((databaseObject) => { transform.setJsonObject(jsonObject); transform.setDatabaseObject(databaseObject); }) .then(() => transform.baseExtract()) .then(() => transform.extract()) .then(() => transform.clean()) .then(() => transform.getDatabaseObject().save()) .then((data) => { // PROCESSING DATA }).catch((e) => { // ERROR }); } }); Promise.all(promises) .then((results) => { return next(); }).catch((e) => { throw e; });
这是生成的有效载荷:
{
"errors": [],
"warnings": [],
"data": []
}
- 正如@KevinB 在评论中所说,您缺少箭头函数内部的 return 调用,因此数据库保存正在进行,因为它们是 Promise 链的一部分,但对响应的推送是停滞等待 return,然后 Express.js 调用在 Promises 执行之前解析。将
return Database.getInstance()
和return transform.baseExtract()
添加到您的代码中以解决此问题。 对结果数组使用 Array.prototype.filter() to remove elements you want to ignore since you won't ever need to execute Promises on them, then call Array.prototype.map()。如果不想使用箭头函数,可以将其指定为
的参数filter
和map
:jsonObjects.filter(函数(jsonObject) {
}, 这个);
var promises = jsonObjects.map(函数(jsonObject) {
}, 这个);