LINUX.ORG.RU

Node.js async objects transformation with timeout

 , ,


0

1

О, Великий ЛОР! Здравствуй снова и опять.
Не мог ли кто-нибудь, обьяснить мне - юному падавану, не врубающемуся, что вообще происходит, понять, куда засунуть функцию

/**
 * Функция, которая найдет ключ и вернет значения из массива данных
 * Возвращает данные с задержкой
 * @param key [string] Ключ, который искать
 * @param obj [object] Массив объектов key/val
 * @param callback
 */
var getValue = function (key, obj, callback) {
    var delay = randomInt(300, 1500);
    console.log('Start getVal "'+key+'", delay '+delay+'ms');
    setTimeout(function () {
        //Find key there

        //if key found return data to callback
        if (true)
            callback(null, key, delay, "data to return");
        else
            callback(new Error("Key not found!"), key, delay);
    }, delay);
    console.log('End getVal "'+key+'", delay '+delay+'ms');
};

Вот в эту работающую функцию
var transformAsync = function(objects, map, data) {
    console.log('Function transformAsync is started.');
    console.log('-----------------------------------');
    var keys = Object.keys(map);
    keys.forEach(function(key){
        objects.forEach(function(object){
            if(typeof map[key] === 'object') {
                var nestedKeys = Object.keys(map[key]);
                nestedKeys.forEach(function(nestedKey) {
                    var nestedValue = map[key][nestedKey];
                    if(nestedValue === object.key) {
                        console.log('%s has been changed to %s', nestedValue, object.val);
                        map[key][nestedKey] = object.val;
                    }
                });
            } else {
                var value = map[key];
                if(value === object.key) {
                    console.log('%s has been changed to %s', value, object.val);
                    map[key] = object.val;
                }
            }
        });
    });
    console.log('------------------------');
    console.log('Function async is ended.');
    console.log('------------------------');
    data(null, map);
};

Чтобы был делей и в коллбеке возвращался измененный объект map.
Я уже второй день не могу допереть :( P.S. Это «продолжение» моей предыдущей темы, где товарищ theNamelessOne мне очень хорошо помог. P.S.S. Если надо объекты из map.json и data.json - вот они:
map.json
{
  "id": "0:0:0:1",
  "type": "0:0:0:2",
  "coords": {
    "latitude": "0:0:0:3:0",
    "longitude": "0:0:0:3:1"
  },
  "unixtime": "0:0:0:4",
  "uptime": "0:0:0:5"
}

data.json
[
  { "key": "0:0:0:1", "val": 25 },
  { "key": "0:0:0:2", "val": 1 },
  { "key": "0:0:0:3:0", "val": "n/a" },
  { "key": "0:0:0:3:1", "val": "n/a" },
  { "key": "0:0:0:4", "val": 0 },
  { "key": "0:0:0:5", "val": 0 }
]

После дня раздумий

После дня раздумий получилось вот это:

'use strict';

var util = require('util');

var randomInt = function (low, high) {
    return Math.floor(Math.random() * (high - low) + low);
};

var find = function (key, object, callback) {
    object.forEach(function (element) {
        setImmediate(function () {
            if (element.key === key) {
                callback(null, true, element.val);
            } else {
                callback(new Error('Key not found!'), false);
            }
        });
    });
};

var getValue = function (key, obj, callback) {
    var delay = randomInt(300, 1500);
    console.log('Start getVal "' + key + '", delay ' + delay + 'ms');
    setTimeout(function () {
        // Find key there
        find(key, obj, function (err, result, val) {
            if (result) {
                callback(null, val);
            } else {
                console.error(err);
            }
        });
    }, delay);
    console.log('End getVal "' + key + '", delay ' + delay + 'ms');
};

var getKey = function (map, callback) {
    var keys = Object.keys(map);
    keys.forEach(function (key) {
        callback(null, key);
    });
};
var result;
var transformAsync = function (objects, map, callback) {
    console.log('Function transformAsync is started.');
    console.log('-----------------------------------');
    getKey(map, function (err, key) {
        if(typeof map[key] === 'object') {
            getKey(map[key], function (err, nestedKey) {
                if (err) console.error(err);
                getValue(map[key][nestedKey], objects, function (err, value) {
                    if (err) console.error(err);

                    map[key][nestedKey] = value;
                    result = map;
                    callback(null, map);
                });
            });
        } else {
            getValue(map[key], objects, function (err, value) {
                if (err) console.error(err);

                console.log('Key is: "%s", Value is: "%s"',key, value);

                map[key] = value;
                result = map;
                callback(null, map);
            });
        }
    });
    console.log('--------------------------------------');
    console.log('Function async is ended.');
};

var getResult = function(map, callback) {
    console.log(util.inspect(map, {depth: null}));
    callback(null, 'Success!');
};

transformAsync(require('./data.json'), require('./map.json'), function (err, map) {
    getResult(map, function (err, message) {
        if (err) {
            console.error(err);
        }
        console.log(message);
    });

});

А вывод все-такой же печальный:

/usr/local/bin/node waterfall.js
Function transformAsync is started.
-----------------------------------
Start getVal "0:0:0:1", delay 590ms
End getVal "0:0:0:1", delay 590ms
Start getVal "0:0:0:2", delay 1147ms
End getVal "0:0:0:2", delay 1147ms
Start getVal "0:0:0:3:0", delay 1251ms
End getVal "0:0:0:3:0", delay 1251ms
Start getVal "0:0:0:3:1", delay 573ms
End getVal "0:0:0:3:1", delay 573ms
Start getVal "0:0:0:4", delay 1010ms
End getVal "0:0:0:4", delay 1010ms
Start getVal "0:0:0:5", delay 549ms
End getVal "0:0:0:5", delay 549ms
--------------------------------------
Function async is ended.
Key is: "uptime", Value is: "0"
{ id: '0:0:0:1',
  type: '0:0:0:2',
[Error: Key not found!]
  coords: { latitude: '0:0:0:3:0', longitude: '0:0:0:3:1' },
[Error: Key not found!]
  unixtime: '0:0:0:4',
[Error: Key not found!]
  uptime: 0 }
[Error: Key not found!]
Success!
[Error: Key not found!]
{ id: '0:0:0:1',
[Error: Key not found!]
  type: '0:0:0:2',
[Error: Key not found!]
  coords: { latitude: '0:0:0:3:0', longitude: 'n/a' },
[Error: Key not found!]
  unixtime: '0:0:0:4',
[Error: Key not found!]
  uptime: 0 }
[Error: Key not found!]
Success!
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
Key is: "id", Value is: "25"
{ id: 25,
  type: '0:0:0:2',
  coords: { latitude: '0:0:0:3:0', longitude: 'n/a' },
  unixtime: '0:0:0:4',
  uptime: 0 }
Success!
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
Key is: "unixtime", Value is: "0"
{ id: 25,
  type: '0:0:0:2',
  coords: { latitude: '0:0:0:3:0', longitude: 'n/a' },
  unixtime: 0,
  uptime: 0 }
Success!
Key is: "type", Value is: "1"
[Error: Key not found!]
{ id: 25,
  type: 1,
  coords: { latitude: '0:0:0:3:0', longitude: 'n/a' },
  unixtime: 0,
  uptime: 0 }
Success!
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
[Error: Key not found!]
{ id: 25,
  type: 1,
  coords: { latitude: 'n/a', longitude: 'n/a' },
  unixtime: 0,
  uptime: 0 }
Success!
[Error: Key not found!]

Process finished with exit code 0

Как мне победить его в конце-концов!? Я уже испытываю ненависть к своим интеллектуальным способностям.
Объясните, пожалуйста, куда копать. Я заблудился.

slaykovsky ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.