Обещания в сложни функции

Чудя се какъв е най-добрият начин за справяне с грешки в дълги функции с обещания?

Моята функция:

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