Ответы пользователя по тегу Асинхронное программирование
  • Как заставить http.get (NodeJS) работать синхронно?

    К тому же `http` в ноде асинхронное, поэтому нужен `callback` или `promise`. А ещё нужно код отрефакторить. Вот навскидку:
    var Request = require('request'),
        Class = require('atma-class');
    module.exports = function prepareTiles(tiles, url, ssid, callback) {
    
        var await = new Class.Await();
        tiles.forEach(function(tile) {
            prepareTile(tile, url, ssid, await.delegate());
        });
        await.always(function(){
            callback(tiles);
        });
    };
    
    function prepairTile(tile, url, ssid, callback) {
        var meta = title.metadata;
        switch (meta.tiletype) {
            case 'mark':
                var search = qs.stringify({
                    url: url,
                    ssid: ssid,
                    mark: meta.mark,
                    type: meta.type,
                    format: meta.format,
                    graph: meta.graph
                });
                val_resolve(
                    'http://127.0.0.1:8080/getSingleMark?' + search
                    , tile
                    , callback);
                break;
            case 'youtube':
            case 'telcall':
            case 'skypecall':
                val_onComplete(tile, meta, callback);
                break;
        }
    }
    
    function val_resolve(url, tile, callback) {
        Request.get(url, function(error, res, body) {
            if (error)
                console.error(error)
            val_onComplete(tile, body, callback);
        });
    }
    
    function val_onComplete(tile, model, callback) {
        tile.metadata.value = tpl.make(
            tile.metadata.tiletype, model
        );
        callback();
    }
    Ответ написан
    1 комментарий
  • Как разделить JavaScript логику?

    Посмотрите на другие загрузчики. Мы вот тоже уже давно с этим столкнулись, и как говорится также создали своё решение IncludeJS. Плюс в том, что он загружает также стили и шаблон. Не требует конфигурационных файлов. Не требует специального обьявления модуля (загружает любые js, но поддерживает °exports). Поддерживает "кастомные загрузчики" .. вот Traceur Compiler Plugin. И потихоньку мигрируем все проэкты на ES6.
    Документации мало, может будет сложно будет разобраться.

    Есть другой ещё очень хороший загрузчик - LMD

    Все они также могут собирать все ресурсы в одни файлы для релиза.
    Ответ написан
    Комментировать
  • [Асинхроность и nodejs] Кто что использует против callback hell и почему?

    Это популярная проблема, все пытаются с ней бороться, придумывают разные инструменты, библиотеки и прочее. Но скажу, что при хорошей архитектуре вложенность функций редко переваливает за 2 штуки - а это уже никакой не `хэл`. Ну вот посмотрите на метод в котором у вас этот самый `хэл`. Это же явное нарушение SOLID - один метод обрабатывает данные, куда-то их посылает, ждет в коллбэке ответ, с ним что-то делает, потом снова вызывает другую асинхронную функцию и опять ждет ответ, и так несколько раз. Поэтому `коллбэк хэл` - это классная штука, которая помогает разбивать код на независимые функции - принял данные, что-то сними сделал, отправил дальше как эти данные, так и другие аргументы. Точка.

    Ответ написан
    Комментировать
  • Node.js (или другие асинхронные фреймворки): А как отлавливать ошибки?

    К node.js имею косвенное отношение, но мне всегда казалось, что:
    • всеми силами надо избегать выброса исключений, а возвращать статус ошибки
    • вызов ассинxорнной функции должен иметь вид:
      asyncFunction(args, function(error, result){})
    И теперь, если перевести эти пункты на ваш код:
    auth.getUser(req, function(error,user) {
      if (error != null){
        handle(res,error);
        return;
      }
      db.getData(function(error,data) {
        if (error != null){
          handle(res,error);
          return;
        }
      res.write(template.render(data));
    });

    Проверки исключений здесь, мне кажется, излишни. Слабое место только template.render(data), надо просто проверить или эта функция бросает исключения. И даже если да, то лучше проверить или объект data валидный перед передачей в render. Пока сам придерживаюсь правила, если в функции для ее нормальной работы надо больше 2/3 if-ов, тогда только try..catch. К сожалению, в Яваскрипте нельзя так гибко обращаться с исключениями как в .NET(печальный вздох). Буду тоже рад если, кто то предложит более конструктивный ответ.
    Ответ написан
    1 комментарий