【问题标题】:Nodejs send waterfall requestsNodejs 发送瀑布请求
【发布时间】:2018-08-14 07:24:07
【问题描述】:

我有一个带有文件夹名称的动态数组,并使用 zipFolder 创建了一个 zip 由于库是异步的,我遇到了问题,即

zipFolder(source,dest,callback)

因为它是异步调用,所以我想阻止下一个请求,除非第一个响应为真,

function (req, res)
     var folder = ['N','PP','Y'];//dynamic just an example

        for( var i = 0 ; i < folder.length ; i++) {
            var source = path.join(basePath,'/download/'+folder[i]);
            var dest =   path.join(basePath,'/createZip/'+folder[i]+'.zip');
            console.log('sending',folders[i])


            //this is async
            zipFolder(source,dest, function(err) {
                if(err) {
                    console.log('oh no!', err);
                } else {
                    console.log('EXCELLENT');//want to send the second,third,fourth if success
                }
            });
        }

总结: 输出应该是这样的:

发送文件 1 如果成功/响应 发送文件 2 如果成功/响应

想要瀑布之类的东西等待回调响应发送第二个文件

另外我想要一个知道完成回调的方法,以便我可以发回响应

【问题讨论】:

  • 我建议使用 Promise 和 async await

标签: node.js async-await async.js waterfall


【解决方案1】:

尝试使用异步waterfall 方法

https://caolan.github.io/async/docs.html#waterfall

连续运行任务数组,每个函数都传递它们的 结果到数组中的下一个。但是,如果任何任务通过 错误到自己的回调,下一个函数不执行,并且 主回调立即调用错误

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
        // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});

更新

在您的用例中eachSeries 更适用。

 var folder = ['N','PP','Y'];


      async.eachSeries(folder, function(item,callback){
            var source = path.join(basePath,'/download/'+item);
            var dest =   path.join(basePath,'/createZip/'+item+'.zip');

            zipFolder(source,dest, function(err) {
                if(err) {
                    console.log('oh no!', err);
                    callback();
                } else {
                    console.log('EXCELLENT');//want to send the second,third,fourth if success
                    callback();
                }
            });

     },function(){
         console.log('all items uploaded');
    });    .

【讨论】:

  • 如何处理上面提供的数组
  • @OsheenFatimah 根据您的要求修改
【解决方案2】:

你可以像这样使用每个:

var each = require('async-each-series')
      var folder = ['N','PP','Y'];


       each(folder, function(items,callback){
        //insert each items to db in async way
           var source = path.join(basePath,'/download/'+items);
           var dest =   path.join(basePath,'/createZip/'+items+'.zip');
           zipFolder(source,dest, function(err) {
                    if(err) {
                        console.log('oh no!', err);
                    } else {
                        console.log(items,'inserted')
                        callback()
                    }
                });

    },function(err){
           if(err) console.log('error occured')
        console.log('all items uploaded');
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多