【问题标题】:NodeJS/Waterline, Need to wait for multiple create end before responseNodeJS/Waterline,需要等待多次创建结束才能响应
【发布时间】:2015-03-07 22:00:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js asynchronous sails.js waterline


    【解决方案1】:

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

    【讨论】:

    • 是的,我正在阅读 Async 文档,async.each 似乎对我来说是最好的解决方案。谢谢:)
    • 我同意每个都会更好。 EachLimit 也很好,如果您在运行它的机器上耗尽内存,您可以限制并行创建的文件数量。
    【解决方案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.
    });
    

    【讨论】:

    • 是的,我听说过 Async,我一直在寻找不使用新库的解决方案,但我想我迟早会需要这个 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 2018-08-04
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多