Nodejs发送瀑布请求

时间:2018-03-06 12:24:02

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

我有foldername的动态数组,并使用 zipFolder 创建一个zip 我面临的问题是图书馆是异步的,即

Google Maps SDK

因为它是异步调用所以需要时间,我想阻止下一个请求,除非第一个请求是真的,

zipFolder(source,dest,callback)

要点: 输出应该是这样的:

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

想要像瀑布一样等待回调响应以发送第二个文件

加上我想要一种方法来了解完成回调,以便我可以发回回复

2 个答案:

答案 0 :(得分:0)

尝试使用异步waterfall方法

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

  

运行函数的tasks数组,每个函数都通过它们   结果到阵列中的下一个。但是,如果任何任务通过了   错误到自己的回调,下一个函数没有执行,并且   主要回调立即调用错误

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');
    });    .

答案 1 :(得分:0)

你可以使用每个:

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');
    });