我有foldername的动态数组,并使用 zipFolder 创建一个zip 我面临的问题是图书馆是异步的,即
Google Maps SDK
因为它是异步调用所以需要时间,我想阻止下一个请求,除非第一个请求是真的,
zipFolder(source,dest,callback)
要点: 输出应该是这样的:
发送文件1 如果成功/响应发送文件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');
});