Express中使用async waterfall时如何传递Sequelize返回的Promise结果到下一级函数
问题根源
- 你的
getanythinghere返回的是Promise对象,你在waterfall第一个任务里没有等待Promise执行完成,就直接把未resolve的Promise对象传给了下一个函数,所以打印出来是Promise { <pending> } - 另外你写的
getanythinghere已经是async函数,没必要再手动套一层new Promise,属于冗余写法,Sequelize的query方法本身就返回Promise,直接返回即可。
修复方案
第一步:简化getanythinghere写法
exports.getanythinghere = async function() { const query = "SELECT anything, here " + "FROM anywhere WHERE ignore this query"; // 直接返回sequelize查询的Promise即可,不需要额外包一层 return db.sequelize.query(query, { type: QueryTypes.SELECT }); }
第二步:修改waterfall的任务逻辑,等待Promise完成再传值
两种实现方式均可:
方式1:用Promise的then回调调用waterfall的callback
async.waterfall([ function(callback) { getanythinghere() .then(trying => { // 查询成功后再调用callback,把结果传给下一个任务 callback(null, trying); }) .catch(err => { // 出错要把错误传给callback,触发waterfall的错误处理 callback(err); }); }, function(dataone, callbackt) { console.log("dataone is ", dataone); // 后续如果还有任务要传值就继续调用callbackt,没有的话也要调用结束流程 callbackt(null, dataone); } ], function(err, res) { if (err) { // 注意确保当前作用域存在callback变量,避免未定义报错 return callback(err); } callback(null, res); });
方式2:给waterfall的任务加async标识,直接await获取结果
async库支持async函数作为任务,写法更简洁:
async.waterfall([ async function() { // 直接await拿到结果返回即可,async库会自动把返回值传给下一个任务 return getanythinghere(); }, async function(dataone) { console.log("dataone is ", dataone); return dataone; } ], function(err, res) { if (err) return callback(err); callback(null, res); });
注意事项
如果用async函数作为waterfall的任务,不需要手动调用callback,只要正常return值或者throw错误即可,async库会自动处理流程。
内容的提问来源于stack exchange,提问作者Al Kasih
相关产品推荐
相关产品推荐

