javascript - node.js:将异步函数列表应用于列表列表中的每个项目

标签 javascript node.js asynchronous

我有一个人员列表,每个人都包含一个图像网址列表。
我需要下载每个网址,然后计算该图像的“签名”,验证它是否唯一,然后将其保存到文件系统。
我当前的方法是:两个嵌套的 async.each 调用和一个 async.waterfall 来检查和保存图像(为简单起见,省略错误处理): var async = require('async'); var request = require('request');

var syncPersonsImages = function(persons, images, callback) {
  async.each(
    persons,
    function(person, callbackPerson) {
      async.each(
        person.imageUrls,
        function(imageUrl, callbackImage) {
          download(imageUrl, function(err, image) {
            downloadPost(callbackImage);
          });
        },
        function(err) {
          callbackPerson();
        }
      );
    },
    function(err) {
      callback(null, persons);
    }
  );

  function download() {
    request(
      { uri: image.url },
      function(err) {
        callback(err, image);
      },
      function(contents, res) {
        image.contents = res.contents;
        callback(null, image);
      }
    );
  }

  function downloadPost(image, callback) {
    async.waterfall(
      [
        getSignatureFromImage,
        findSimilarSignatureImage,
        saveImage,
      ],
      function (err, image) {
        callback(image);
      }
    );
  }

  function getSignatureFromImage(image, callback) {
    image.signature = crypto.createHash('md5').update(image.url).digest('hex');
    callback(null, image);
  }

  function findSimilarSignatureImage(image, callback) {
    if (existsAlready(image.signature)) { // this function is not shown but it's behaviour is clear...
      image.isNew = true;
    }
    callback(null);
  }

  function save(image, callback) {
    if (image.isNew) {
      img.save(function(err) {
        console.log('image', image.url, 'saved');
        callback(null, image);
      }
    } else {
      callback(null, null);
    }   
  }

};

问题是 syncPersonsImages 方法永远不会终止...
有什么建议吗?
我的方法至少理论上是正确的吗?

最佳答案

总的来说,我认为这种方法是合理的。有几点。我认为您不必要地包装了一些回调。例如,这个:

  function(person, callbackPerson) {
    async.each(
      person.imageUrls,
      function(imageUrl, callbackImage) {
        download(imageUrl, function(err, image) {
          downloadPost(callbackImage);
        });
      },
      function(err) {
        callbackPerson();
      }
    );
  },
  function(err) {
    callback(null, persons);
  }
);

可以更改为:

function(person, callbackPerson) {
  async.each(
    person.imageUrls,
    function(imageUrl, callbackImage) {
      download(imageUrl, function(err, image) {
        downloadPost(callbackImage);
      });
    }, callbackPerson);
}, callback);

...取决于您是否希望 async.each 调用在第一次出现错误时退出。

此外,您定义了不带参数的下载方法。

关于javascript - node.js:将异步函数列表应用于列表列表中的每个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098874/

相关文章:

node.js - 按一对多关系中的子项数量对查询进行排序

c# - 如何根据条件等待任务?

mysql - Node.js - 使用异步函数以同步方式获取返回值,无需回调

javascript - 在 Parse.com 的 Cloud 代码中,异步代码为 for 循环中的变量提供了错误的值

javascript - 将对象属性设置为同一对象中属性的负值 (Javascript/jQuery)

javascript - 在 JavaScript 中单击按钮后删除输出

javascript - 如何使用字符串作为选择器在对象中设置数据?

c# - Ajax 内容类型 Unicode 问题

node.js - 在nodejs应用程序中使用PDFKit发送动态创建的PDF作为附件

node.js:来自 child_process 的 console.log