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

标签 javascript node.js asynchronous sails.js waterline

在我的 nodejs 应用程序(使用 sailsjs)中,我使用 Controller 接收以 .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(自动递增),但是创建方法是异步的。
有什么办法可以等待所有创建方法结束,然后才能发送服务器响应?

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

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

最佳答案

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

关于javascript - NodeJS/Waterline,需要等待多次创建结束才能响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862979/

相关文章:

java - 使用 Spring Boot 异步自定义 ThreadPoolTask​​Executor

javascript - Mocha JS : How to reference members from asynch before function in describe/it test functions

javascript - 对 var app=express() 有点困惑

c# - 这两种异步方法有什么区别?

javascript - 修改状态和更新我的 reducer 的正确方法? ( react /Redux)

javascript - Bootstrap 3 : Click over button doesn't work

node.js openssl 包装器(不是 cli)

javascript - 我是否阅读了搜索查询中的所有推文

原型(prototype)内的 Javascript 对象

javascript - 我如何自动定期从 Signalr 接收消息到所有客户端,而无需客户端输入?