在我的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);
}
});
});
但如果有人有更好的解决方案......:)
答案 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);
});