我需要保存到异步瀑布系列内的数据库中。
我试图在clean函数之后整合这两个函数
function connectDb(next) {
pool.getConnection(function(err, connection) {
if (err) console.log(err);
conn = connection;
}, next);
},
function saveDb(next) {
let sql = "UPDATE media SET media_url = ? WHERE media_url = ?";
conn.query(sql, [dstKey, srcKey], function (error, results, fields) {
if (error) {
conn.release();
console.log(error);
}else{
console.log("media db updated");
}
}, next)
}
问题在于这两个函数阻止了代码执行。如何将其集成到下面的函数中?我试图将函数包装在promise中,但是它也无法正常工作。
async.waterfall([
function download(next) {
s3.getObject({
//param
},
next);
},
function transform(response, next) {
resizeMedia(response.Body ).then( ( file ) => { next();} ).catch( (err) => { reject(err) } ); }
},
function upload(next) {
var fileData = fs.createReadStream('/tmp/'+dstKey);
if (isVideo ) { var ContentType = 'video/mp4' }
if (isAudio ) { var ContentType = 'audio/mp3' }
s3.putObject({
//param
},
next);
},
function clean(next) {
// Stream the transformed image to a different S3 bucket.
fs.unlinkSync('/tmp/'+dstKey);
s3.deleteObject({
//param
},
next);
}
], function (err) {
if (err) {
console.error('Error');
callback(null, "Error");
return;
} else {
console.log('Success');
callback(null, "Done");
return;
}
callback(null, "Done");
return;
}
);
答案 0 :(得分:0)
异步水流的目的是阻塞waterfall
直到调用回调。
P.S。通常,您不应该每次都创建一个新的数据库连接。连接应在应用程序启动时完成一次,并在需要时使用。
我强烈建议您改用knex.js,它默认会返回promise,如果您想在异步瀑布内使用它(并等待解析),可以致电.asCallback
。
答案 1 :(得分:0)
如果有人遇到同样的问题,我已经找到了解决方案:
如果瀑布函数具有响应,则此响应将自动添加为下一个函数中的第一个参数。在我的代码中,错误很简单(一夜熟睡),s3.deleteObject和s3.putObject有响应,此响应需要设置为第一个参数,而回调必须设置为最后一个,因为您说我只使用了回调作为参数(下一个),这破坏了我的代码。
[...]
function upload(next) {
s3.putObject({
//param
},
next);
},
function clean(response, next) { // response in arguments
s3.deleteObject({
//param
},
next);
}
[...]