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