NodeJS/Waterline,需要等待多次创建结束才能响应

NodeJS/Waterline, Need to wait for multiple create end before response

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

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);

问题是我需要发回所有生成的图像 ID(自动递增),但是创建方法是异步的。
有什么方法可以等待所有创建方法结束,然后才能发送服务器响应 ?

编辑:所以我通过检查获取的图像数量并在 .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);
        }
    });
});

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

我会说您想检查 promises 或 async。

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.
});

在这种情况下,我会选择 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);
});