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

在我的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); 

问题是我需要发回所有生成的图像ID(自动递增),但创build方法是asynchronous的。
有什么办法可以等待所有的创build方法结束之前,我可以发送服务器响应?

编辑:所以我find了一个工作,通过检查我得到的图像的数量,并在.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); } }); }); 

但如果有人有更好的解决scheme… 🙂

在这种情况下,我会去async.each ,因为zipEntries是一个集合(没有testing这个代码):

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

我会说你想签出承诺或asynchronous。

asynchronous具有并行function,我觉得在这种情况下很有用。

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

它允许您一次运行多个asynchronous函数,然后在完成所有函数时调用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. });