NodeJS / Waterline,需要在响应之前等待多个创建结束

时间:2015-01-09 14:38:29

标签: javascript node.js asynchronous sails.js waterline

在我的nodejs应用程序中(使用sailsjs),我使用控制器接收.zip上传的多个图像,然后使用水线将它们保存在我的数据库中:

var images = [];
zipEntries.forEach(function(zipEntry) {
    zip.extractEntryTo(zipEntry.entryName, p, false, true);

    Image.create({
        filename: zipEntry.name,
    }).exec(function(err, image){
        images.push(image);
    });
});
res.json(images);

问题是我需要发回所有生成的Image Ids(自动递增),但create方法是异步的。
在我发送服务器响应之前有没有办法等待所有create方法结束?

编辑:所以我通过检查我获得的图像数量并在.exec方法中增加索引找到了解决方法,我可以检查这是否是最后一个exec,然后发送响应。

var images = [],
    nbValidImage = 0,
    i = 0;
zipEntries.forEach(function(zipEntry) {
    zip.extractEntryTo(zipEntry.entryName, p, false, true);
    nbValidImage++;
    Image.create({
        filename: zipEntry.name,
    }).exec(function(err, image){
        i++;
        images.push(image);
        if(i == nbValidImage) {
            res.json(images);
        }
    });
});

但如果有人有更好的解决方案......:)

2 个答案:

答案 0 :(得分:2)

我想说你想要签出承诺或异步。

Async有一个我认为在这种情况下有用的并行函数。

https://github.com/caolan/async#paralleltasks-callback

它允许您一次运行多个异步函数,然后在完成所有函数时调用回调。

我认为它可以完美地满足您的需求。

以下是他们的文档中的示例:

var async = require('async');

async.parallel([
   function(callback){
       setTimeout(function(){
           callback(null, 'one');
       }, 200);
   },
   function(callback){
       setTimeout(function(){
           callback(null, 'two');
        }, 100);
    }
],
// optional callback
function(err, results){
    // the results array will equal ['one','two'] even though
    // the second function had a shorter timeout.
});

答案 1 :(得分:2)

在这种情况下,我会选择async.each,因为zipEntries是一个集合(不测试此代码):

var async = require('async');

async.each(zipEntries, function (zipEntry, callback) {
  zip.extractEntryTo(zipEntry.entryName, p, false, true);

  Image.create({
    filename: zipEntry.name
  }).exec(function (err, image) {
    images.push(image);
    callback();
  });

}, function (err) {
  if (error) throw new Error(error);
  res.json(images);
});