Промисы в сложных функциях

Мне интересно, как лучше всего обрабатывать ошибки в длинных функциях с обещаниями?

Моя функция:

module.exports = function(data) {
  var deferred = Q.defer();
  var config = {};


  fs.readdir(path, function(err, files) {
    if (err) {
      deferred.reject(new Error(err));
    }
    var infoPath = false;

    files.forEach(function(filename) {
      if (filename.indexOf('.info') !== -1) {
        infoPath = path + '/' + filename;
        config['moduleName'] = filename.replace('.info', '');
      }
    });

    if (!infoPath) {
      deferred.reject(new Error('Did not find .info-file'));
    }

    if (files.indexOf(config['moduleName'] + '.module') > -1) {
      config.type = 'Modules';
    }
    else {
      deferred.reject(new Error('Unknown project type'));
    }

    // Parse the info file.
    fs.readFile(infoPath, function (err, content) {
      if (err) {
        deferred.reject(new Error(err));
      }

      data.config = config;
      data.infoContent = content.toString();

      deferred.resolve(data); 
    });
  });
  return deferred.promise;
};

Насколько я понимаю, это способ использования Q.defer. Но если выдается ошибка, я не хочу/нужна пробовать остальную часть функции. Я что-то упустил или есть лучший способ сделать это?


person andeersg    schedule 30.01.2016    source источник
comment
Посмотрите здесь. Попробуйте обещать на самом низком уровне, т.е. сделайте readdir/readfile функции, которые возвращают обещания (и не имеют никакой дополнительной логики), а затем используйте только их и избегайте конструктора Promise в других местах.   -  person Bergi    schedule 31.01.2016
comment
Спасибо, Берги, это действительно объяснило мою проблему/вопрос :)   -  person andeersg    schedule 01.02.2016


Ответы (1)


Отклонение обещания чудесным образом не останавливает выполнение остальной части кода функции. Итак, после отклонения вы должны вернуться из функции:

if (err) {
  deferred.reject(new Error(err));
  return;
}

Или короче:

if (err) {
  return deferred.reject(new Error(err));
}
person robertklep    schedule 30.01.2016
comment
Ах, это так просто :) Думал, что это может напортачить с внутренними вещами в Q. - person andeersg; 30.01.2016
comment
Зачем это делать? - person robertklep; 30.01.2016
comment
Не знаю, просто интересно, правильно ли это. Еще не знаком с промисами. - person andeersg; 30.01.2016