Рефакторинг вложенных обратных вызовов, node.js, асинхронность

function indexArticles(callback) {
  fs.readdir("posts/", function(err, files) {
    async.map(files, readPost, function(err, markdown) {
      async.map(markdown, parse, function(err, results) {
        async.sortBy(results, function(obj, callback) {
          callback(err, obj.date);
        }, function(err, sorted) {
          callback( {"articles": sorted.reverse()} );
        });
      });
    });
  });
}

Я пытаюсь понять, как сделать это красивее --, поскольку вы можете сказать, что я использую асинхронную библиотеку caolan, но я не уверен, какую из структур потока управления использовать. Кажется, что если я использую, например, async.waterfall, это приводит к значительно большему количеству кода, и каждый шаг должен быть заключен в анонимную функцию. Например, это только первые две строки вложенной версии с водопадом:

function indexArticles(callback) {
  async.waterfall([
    function(callback) {
      fs.readdir("posts/", function(err, files) {
        callback(err, files)
      })
    },

    function(files, callback) {
      async.map(files, readPost, function(err, markdown) {
        callback(err, markdown)
      })
    }])
}

Как бы вы это улучшили?

Если бы был способ частично применять аргументы НЕ только слева, то я мог бы сделать, например,

function indexArticles(callback) {
  async.waterfall([
    async.apply(fs.readdir, "posts/"),
    async.apply(async.map, __, readPost),
    async.apply(async.map, __, parse),
    // etc...
  ])
}
6
задан Austin Yun 17 July 2012 в 01:03
поделиться