nmeri17 Ответов: 1

Возвращаемое значение из пакетной асинхронной операции


У меня есть небольшая библиотека, которая должна выполнить пару асинхронных операций и вернуть объект, содержащий результат этих операций, но интерпретатор либо говорит, что функция не является конструктором, либо, когда он принимает конструктор, операция возвращает пустой объект. Я думаю, что моя проблема связана с моей переменной областью видимости, но, возможно, все может быть и хуже.

Что я уже пробовал:

Сам код выглядит так
var render = {username: '', available: '', orders: '', frequent: ''},
attachModule = 1;

 function OnIndexLoad (username) {

this.endRes = function (username) {
    render.username = username;
    console.log(render)
    return render;
};

this.init = function (username, current) {
    var utilMap =    {

    1: function (index) {
        http.get({port: '1717', path: '/admin/', headers: {Accept: 'text/html'}}, function(res) {
        var temp = ''
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            temp += chunk;
        }).on('end', function() {
    // add result of async operation
            render.available = temp
            index++
        })

    }).on('error', function(e) {
            console.log(e)
        });
    },

    2: function(index) {
        http.get('http://localhost:1717/admin/page=20',  function(res) {

        var temp = ''
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            temp += chunk;
        }).on('end', function() {
    // add result of async operation
            render.orders = temp;
            index++
        })
    }).on('error', function(e) {
            console.log(e)
        });
    },

    3: function(index) {
        ordersModel.find({}, , function (err, orders) {
        if (err) throw err;

// ignore this whole bit but look out for the function's last line
        var hashMap = [], returnArr = [];

        orders.forEach(function (order) {
            hashMap.push(order.toObject()['food'].split(","));
        })

        hashMap.reduce(function(a, b) {
            return a.concat(b)
        }, []).forEach(function(item) {

            if ((k = returnArr.findIndex(function(elem) {
                return elem[0] == item;
            })) != -1) {
                returnArr[k][1]++;
            }
            else returnArr.push([item, 1]);
        })

        hashMap = [], returnArr = returnArr.sort(function(a, b) {
            return b[1] - a[1];
        }).slice(0, 5).forEach(function(elem) {
            hashMap.push({name: elem[0], counter: elem[1]})
        });
    // add result of async operation
        render.frequent = component("frequent", hashMap); // here
        index++;
    })
    }
    }; // close util map

// the important part
    var itemsToReturn = Object.keys(render).filter(e => e != 'username');
    utilMap[current](current);

    if (attachModule < itemsToReturn.length) {
            this.init(current, username) // does not recurse and incrementally perform async ops
        }
        else this.endRes(username);
}

this.init(attachModule, username)
}

exports = OnIndexLoad


Затем в промежуточном программном обеспечении из вызывающего скрипта, т. е. index.js требуя этого библиотека, У меня есть,

var onIndexLoad = require("./lib/index-load");
new onIndexLoad(req.session.username);


Я думал, что, называя его таким образом, я открою для себя загруженный объект-что-то вроде этого

{key1: resultOfOperation1, key2: resultOfOperation2, key3: resultOfOperation3}

Но называя это так, вы только разоблачаете ошибки. Как мне назвать endRes только и только тогда, когда render объект готов к экспорту?

1 Ответов

Рейтинг:
0

Patrice T

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Отладка JavaScript[^]
Хром Инструменты Разработчика  |  Сеть  |  Разработчики Google[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


nmeri17

Но я же сказал тебе, что говорит консоль. Функция не является конструктором. Он даже не работает, не говоря уже о том, чтобы позволить мне наблюдать какие-либо точки останова. Кроме того, код на стороне сервера js, так что у меня нет, так сказать, devtools. Здесь важно то, что функция не работает с самого начала.

Patrice T

Ты сказал::
"или когда он принимает конструктор, операция возвращает пустой объект."
Смотреть на:
Отладчик | Node.js В7.8.0 документация[^]