【问题标题】:Async and parallel functions in nodejsnodejs中的异步和并行函数
【发布时间】:2014-11-27 07:52:32
【问题描述】:

我在异步模块中使用 parallel() 函数获取并发出问题...

数组images 为空...

var asyncTasks = [];

switch(type){
  case 'instafilm':

    var newFileName;
    var images = [];

    selectedPhotos.forEach(function(id){
      newFileName = pathDir + '/' + id + '.jpg';
      asyncTasks.push(function(callback){
        self.api.media(id, function(err, media, remaining, limit) {
          images.push(media.images.thumbnail.url);
        });
      });
    });

    asyncTasks.push( function(callback){
      console.log(images); // empty
    });


    break;
}

console.log(images); // empty

编辑#1:

var asyncTasks = [];

var newFileName;
var images = [];

selectedPhotos.forEach(function(id){
  newFileName = pathDir + '/' + id + '.jpg';
  asyncTasks.push(function(callback){
    self.api.media(id, function(err, media, remaining, limit) {
      images.push(media.images.thumbnail.url);
      callback(null);
    });
  });
});

asyncTasks.push( function(callback){
  console.log(images); // before creating .zip I need to write files using images[]
  gm()
  .in('-page', '+0+0')
  .in('./public/images/instafilm.jpg')
  .in('-page', '+10+10')
  .in(images[0])
  .in('-page', '+10+30')
  .in(images[1])
  .in('-page', '+10+60')
  .in(images[2])
  .in('-page', '+10+90')
  .in(images[3])
  .mosaic()
  .minify()
  .write(newFileName, function (err) {
    if (!err) console.log('done');
    if (err) console.log(err);
    callback();
  });
});



async.parallel(asyncTasks, function(){
    // here I write a .zip file
    var admZip = new AdmZip();
    var pathDir = './public/uploads/'+reference;
    admZip.addLocalFolder(pathDir);
    var willSendthis = admZip.toBuffer();
    admZip.writeZip('./public/uploads/'+reference+'.zip');   
});

【问题讨论】:

    标签: node.js asynchronous node-async


    【解决方案1】:

    如果我理解你的 sn-p 正确,你的 callback 函数永远不会被调用:

    self.api.media(id, function(err, media, remaining, limit) {
      images.push(media.images.thumbnail.url);
    });
    

    这是个问题。

    我能想到的另一个问题是您在执行此 sn-p 之后调用 console.log(images)(因此尚未执行异步代码)并作为并行调用的一部分。但是正如它的名字所暗示的那样(它是docconfirm)并行运行你的任务“并行”(尽可能多的节点允许它)。

    因此,特别是由于 console.log() 是同步的,因此您的 media([...]) 调用将没有时间在控制台调用之前完成。

    如果我猜对了,那么你需要像这样添加一个回调:

    function(callback){
      self.api.media(id, function(err, media, remaining, limit) {
        images.push(media.images.thumbnail.url);
        callback(null);
      });
    }
    

    并检查图像内容之后你的异步代码完成像:

    parallel(asyncTasks,function(){
      console.log(images)
    })
    

    编辑: 根据新代码 sn -p :

    代码的第一部分看起来不错,直到 gm 调用应该这样完成:

    async.parallel(asyncTasks, function(){
      gm()
      .in('-page', '+0+0')
      .in('./public/images/instafilm.jpg')
      .in('-page', '+10+10')
      .in(images[0])
      .in('-page', '+10+30')
      .in(images[1])
      .in('-page', '+10+60')
      .in(images[2])
      .in('-page', '+10+90')
      .in(images[3])
      .mosaic()
      .minify()
      .write(newFileName, function (err) {
        if (!err) console.log('done');
        if (err) console.log(err);
        // here I write a .zip file
        var admZip = new AdmZip();
        var pathDir = './public/uploads/'+reference;
        admZip.addLocalFolder(pathDir);
        var willSendthis = admZip.toBuffer();
        admZip.writeZip('./public/uploads/'+reference+'.zip');   
      });
    });
    

    【讨论】:

    • 但是你的回调函数(你在哪里制作一个 zip)被调用了?另外,你的 gm() 函数在做什么?看起来它应该在你的 asyncTasks 完成之后调用它,就在你制作 zip 之前。在这里,它是在您的 Images 数组构造期间调用的。
    • 是的 .zip 构造被调用,因为我得到一个空的 .zip 文件...我的 gm() 函数正在将文件写入特定文件夹...
    • 尝试在最终回调中调用 gm(调用 admZip)。这样,当您调用 gm 时,您的图像数组将被填充。然后在 gm 的 write 回调中调用 admZip。 已编辑答案以解释这一点
    • 不起作用...当我将 GM() 函数放在 .zip 构造之前,我的 .zip 文件为空...
    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2021-07-14
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多