Невозможно получить результаты обещания с обещанием. Все () - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть многократные обновления обещаний с 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)
    });
});

Кто-нибудь знает, что не так?

Редактировать: я вставил весь маршрут, чтобы дать вам более подробную информацию.

1 Ответ

0 голосов
/ 16 ноября 2018

Функция обновления 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}); в ваш код . без этого тоже будет работать

...