Переменная потеря данных после выхода из mongo db access Node.js - PullRequest
0 голосов
/ 24 декабря 2018

Я все еще немного новичок в Node.js и Javascript.Я знаю, что javascript по своей природе асинхронный, но я не могу понять, как решить эту проблему.Я пытался использовать Promises, но это не помогло в данном конкретном случае (или, может быть, я не знаю, как работают обещания).

Внутри моей функции getChilds () я выполняю поиск по id в моей базе данных mongoи я помещаю найденный объект в массив с именем childObjects, который я получаю параметром в функции getChilds ().

Объект найден и добавлен в массив childObjects.Я использую console.logs, чтобы проверить, что он работает.Проблема в том, что при выходе из функции значение childObjects не определено.

Моя функция getChilds ():

function getChilds(id, childObjects, res) {
    return new Promise((resolve, reject) => {
        Item.findById(id, function (err, item) {

            if (err) {
                console.log("There's no corresponding item for that id!");
                return (res.send(err));
            }
            console.log("CHILD ITEM:" + item);

            childObjects.push(item);

            console.log("chiild ojects: " + childObjects);
            // return childObjects;
            // res.send(childObjects);
            // return childObjects;
            // res.send(item);

            resolve(item);
            // childObjects.push(item);
        });
    });
}

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вы не должны передавать childObjects in. У вас есть два варианта: либо вы определяете childObjects на том же уровне getChilds.Например, если вы можете вызвать this.getChilds, то массив childObjects должен существовать в this.childObjects.Или вы resolve(item) и в обратном вызове функции, где вы сделали this.getChilds(id).then(, вы нажимаете на childObjects, живущую в родительском элементе.

0 голосов
/ 24 декабря 2018

Вы совершенно правы.Вы столкнулись с этой проблемой, потому что вы использовали Promise.С Promise ваш код становится неблокирующим кодом.

Я могу предложить два решения для решения этой проблемы.

Область:

let childObjects;
function getChilds(id, res) {
    return new Promise((resolve, reject) => {
        ...
    });
}

Возвращаемое значение:

function getChilds(id, childObjects, res) {
    return new Promise((resolve, reject) => {
            ...
            resolve({item: item, childObjects: childObjects);
        });
    });
}
0 голосов
/ 24 декабря 2018

Вы не должны передавать childObjects в качестве аргумента или res.Вместо этого соберите item в childObjects вне функции:

function getChilds(id) {
    return new Promise((resolve, reject) => {
        Item.findById(id, function (err, item) {
            return err ? reject(err) : resolve(item);
        });
    });
}

Используйте Promise.all, чтобы получить массив childObjects:

// Somehow you will get an array of id values, maybe like this:
const childs = item.childs;
// Create promises for each of them
const promises = childs.map(getChilds);
// Promise.all will await all the promises to resolve, putting all items in an array: 
Promise.all(promises).then(childObjects => {
    console.log(childObjects);
    res.send(childObjects);
}).catch(err => {
    console.log('Error occurred', err);
    res.send(err);
});

Обратите внимание, что во множественном числе«ребенок» - это «дети», а не «дети»; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...