无法使用 promise.all() 获得承诺结果
Cannot get promise results with promise.all()
我有多个带有 sequelize 的更新承诺,并由 Promise.all
并行执行它们
我得到的结果是:[[1]]
代码如下:
const express = require('express');
const router = express.Router();
const PLZ = require('../models/index').PLZ;
const Zone = require('../models/index').Zone;
const multer = require('multer');
const path = require('path');
const XLSX = require('xlsx');
router.post('/add', function (req, res, next) {
let zone = {
name: req.body.name,
color: req.body.color
};
const plzs = req.body.plzs;
for (let i = 0; i < plzs.length; i++) {
if (plzs[i].plz.toString() === plzs[i].city && plzs[i].plz.toString() === plzs[i].district) {
plzs[i].city = null;
plzs[i].district = null;
}
delete plzs[i].checked;
}
Zone.create(zone).then((result_zone) => {
let update_operations = [];
let zone_plzs = [];
// associate with plzs and put PLZs to database
for (let i = 0; i < plzs.length; i++) {
plzs[i].zone_id = result_zone.dataValues.id;
zone_plzs.push(plzs[i]);
update_operations.push(PLZ.update({zone_id: plzs[i].zone_id}, {where: {id: plzs[i].id}}).then((result) => {
return result
}));
}
Promise.all(update_operations)/*.then((arrayOfArrays) => {
return [].concat.apply([], arrayOfArrays);
})*/.then((result) => {
res.send({status: true, data: {zone: result_zone, plzs: result}})
}).catch(function (err) {
return next(err);
});
}).catch(function (err) {
next(err)
});
});
有谁知道怎么了?
编辑:我插入了整个路线以提供更多详细信息。
sequelize 的更新函数returns 一些受影响的行(结果数组的第一个参数)。
PLZ.update({zone_id: plzs[i].zone_id}, {where: {id: plzs[i].id}}).then((result) => {
return result
});
因此 output 将是 [1]
,然后将其推入 update_operations
, 对于 Promise.All
Promise.All 将 return 结果数组 [[1]]
,这就是您将得到的。所以这没有错,你得到的是对的。
我认为,您想要的是 return 结果,而不是受影响的行,在这种情况下,您需要添加 returning: true
,例如
PLZ.update(
{ zone_id: plzs[i].zone_id },
{
where: {id: plzs[i].id} ,
returning: true, // <--------- HERE
}
);
NOTE : There is no need of .then((result) => { return result }); in
your code . it will work without that also
我有多个带有 sequelize 的更新承诺,并由 Promise.all
并行执行它们我得到的结果是:[[1]]
代码如下:
const express = require('express');
const router = express.Router();
const PLZ = require('../models/index').PLZ;
const Zone = require('../models/index').Zone;
const multer = require('multer');
const path = require('path');
const XLSX = require('xlsx');
router.post('/add', function (req, res, next) {
let zone = {
name: req.body.name,
color: req.body.color
};
const plzs = req.body.plzs;
for (let i = 0; i < plzs.length; i++) {
if (plzs[i].plz.toString() === plzs[i].city && plzs[i].plz.toString() === plzs[i].district) {
plzs[i].city = null;
plzs[i].district = null;
}
delete plzs[i].checked;
}
Zone.create(zone).then((result_zone) => {
let update_operations = [];
let zone_plzs = [];
// associate with plzs and put PLZs to database
for (let i = 0; i < plzs.length; i++) {
plzs[i].zone_id = result_zone.dataValues.id;
zone_plzs.push(plzs[i]);
update_operations.push(PLZ.update({zone_id: plzs[i].zone_id}, {where: {id: plzs[i].id}}).then((result) => {
return result
}));
}
Promise.all(update_operations)/*.then((arrayOfArrays) => {
return [].concat.apply([], arrayOfArrays);
})*/.then((result) => {
res.send({status: true, data: {zone: result_zone, plzs: result}})
}).catch(function (err) {
return next(err);
});
}).catch(function (err) {
next(err)
});
});
有谁知道怎么了?
编辑:我插入了整个路线以提供更多详细信息。
sequelize 的更新函数returns 一些受影响的行(结果数组的第一个参数)。
PLZ.update({zone_id: plzs[i].zone_id}, {where: {id: plzs[i].id}}).then((result) => {
return result
});
因此 output 将是 [1]
,然后将其推入 update_operations
, 对于 Promise.All
Promise.All 将 return 结果数组 [[1]]
,这就是您将得到的。所以这没有错,你得到的是对的。
我认为,您想要的是 return 结果,而不是受影响的行,在这种情况下,您需要添加 returning: true
,例如
PLZ.update(
{ zone_id: plzs[i].zone_id },
{
where: {id: plzs[i].id} ,
returning: true, // <--------- HERE
}
);
NOTE : There is no need of .then((result) => { return result }); in your code . it will work without that also