承诺复杂的功能

时间:2016-01-30 15:41:45

标签: node.js promise

我想知道使用promises处理长函数错误的最佳方法是什么?

我的功能:

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的方法。但是如果抛出错误,我不希望/需要它来尝试其余的功能。我错过了什么或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

拒绝承诺不会奇迹般地阻止函数执行其余的代码。所以在拒绝之后,你应该从函数返回:

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

或更短:

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