【问题标题】:Cannot get promise results with promise.all()无法使用 promise.all() 获得承诺结果
【发布时间】:2019-04-19 01:11:55
【问题描述】:

我有多个更新承诺与续集并由 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)
    });
});

有谁知道怎么回事?

编辑:我插入了整个路线以提供更多详细信息。

【问题讨论】:

  • 您正在为您的Promise.all 推送一个带有then 子句的承诺到一个数组中。在您到达Promise.all 之前,您的承诺已经得到处理
  • 我编辑了第一篇文章并插入了整个路线代码和导入。
  • @EvanBechtol 将带有then 子句的承诺数组放入Promise.all 并没有错,只要您在上述then 子句中返回一些内容即可
  • 在 OP 的情况下它是多余的,是的,但绝不有害。 OP 只是重新返回结果
  • 这不像@shkaper所说的那样工作,没有效果。

标签: javascript node.js promise sequelize.js bulkupdate


【解决方案1】:

sequelize 的更新函数返回受影响的行数(结果数组的第一个参数)。

PLZ.update({zone_id: plzs[i].zone_id}, {where: {id: plzs[i].id}}).then((result) => {
    return result
});

所以它的 输出 将是 [1] ,然后你将它推入 update_operations ,对于 Promise.All

Promise.All 将返回结果数组,所以 [[1]] ,这就是你将得到的。所以这并没有错,你得到的是正确的。


我认为,您想要的是返回结果,而不是受影响的行,在这种情况下,您需要添加 returning: true,例如

PLZ.update(
    {   zone_id: plzs[i].zone_id    }, 
    {   
        where: {id: plzs[i].id} ,
        returning: true, // <--------- HERE
    }
);

注意:不需要 .then((result) => { return result });在 你的代码。没有它也可以工作

【讨论】:

  • 谢谢我发现了,你说的是真的。但是,如果我想得到真正的结果,该怎么办?
  • 我在回答中也提到过,请阅读最后部分
猜你喜欢
  • 2016-01-24
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2018-12-11
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
相关资源
最近更新 更多