【问题标题】:async waterfall and promise异步瀑布和承诺
【发布时间】:2021-12-02 04:10:46
【问题描述】:

我正在使用异步瀑布来处理请求中的嵌套条件,并使用 express 框架。但是我很困惑如何在数据为<promise> 时将数据处理到瀑布中的下一个函数。此承诺数据是来自 sequalize 的查询。

这是草图

exports.getanythinghere = async function() {

  var query = "SELECT anything, here "
            + "FROM anywhere WHERE ignore this query";

  return new Promise((resolve, reject) => {
    db.sequelize.query(query , {
      type: QueryTypes.SELECT    
    }).then(wth => {
      resolve(wth);
    })
  });

}


async.waterfall([
  function(callback) {
    const trying = getanythinghere (); 
    callback(null, trying); 
  },
  function(dataone, callbackt) {
    console.log("dataone is ", dataone); 
  }
], function(err, res) {
  if (err) return callback(err);
  callback(null, res);    
});//waterfall

dataone 总是dataone is Promise { <pending> }

我在这里缺少什么。在jquery,我会做getanythinghere().done(function(){});

但我想在这个瀑布回调中拥有它。

几年前我曾经这样做过,但由于java和php太多我忘记了

请帮忙..

【问题讨论】:

  • "我正在使用异步瀑布" - 不要这样做,尤其是在使用 Promise 时。使用 Promise .then() 链或简单的现代 async/await 语法。
  • 顺便说一句,避免Promise constructor antipattern 中的getanythinghere

标签: javascript node.js async-await waterfall


【解决方案1】:

你不再需要像 Async 这样的库,主要是因为 Javascript 现在原生支持 async/await。

首先,这是一个 Promise,因为你可以添加它.then()

db.sequelize.query(query , {type: QueryTypes.SELECT});

由于它是一个 Promise,你不需要(也不应该)将它包装在另一个 Promise 中,你也可以简单地等待它,而不是使用 .then()

const trying = await db.sequelize.query(query , {type: QueryTypes.SELECT});

使用await.then() 会解析promise,你会得到一个值,而不是Promise { <pending> }

然后,你可以直接使用trying,你不需要像瀑布一样将它传递给另一个函数。

console.log("trying is ", trying);

最后,您的所有代码都包含在四行中:

try{
  const query = `SELECT anything, here FROM anywhere WHERE ignore this query`;
  const trying = await db.sequelize.query(query , {type: QueryTypes.SELECT});
  console.log("trying is ", trying);
} catch(err) {
  console.log(err);
}

【讨论】:

  • 非常感谢,不敢相信现在可以这么简单。看来我不再需要瀑布了。
  • 但是现在很担心js如果用这个await的真实性能@
  • 你的回答把我引到这里。 stackoverflow.com/questions/51519330/…
  • 你能检查一下George T Kurian的方法真的是一个好习惯吗?它工作得很好。但它似乎不再从回调返回
  • 所有这些异步瀑布现在对我来说都是无稽之谈。几年前我用过,但既然现在 JS 原生支持 async/await,为什么还要加载整个库,用 watrerfall 回调构造 Promises 数组等等? async/await 如此简单、如此精简、如此强大。我将您的 15 行代码(和一个库)重写为 4 行。如果这不能说服你,我不知道会怎样:)
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 2018-07-01
  • 2018-11-13
  • 2020-09-06
  • 2015-10-09
  • 2015-07-18
  • 2015-04-28
相关资源
最近更新 更多