You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:36:03