在JavaScript中使用异步结果的最干净方法

时间:2018-08-07 12:05:22

标签: javascript node.js asynchronous

来自C ++和Python,我仍然在Javascript异步泛滥中苦苦挣扎。有时候它非常有用,但是有时候我只是不编写可怕的代码就看不到如何适应它。

我有一个Node.js + Express CRUD设置,在继续请求之前,我必须做一些基本的检查。我想在运行最终查询之前检查http POST字段是否与数据库字段匹配。我无法将其声明为异步函数并使用await,因为它必须与给定的接口匹配。

showColumns(dbTable)返回带有SHOW COLUMNS查询的数据库前提。

我发现的唯一解决方案是:

database.showColumns(dbTable).then((columns)=>{

  //But do I really need to put all my logic inside a then???

  let row =  Object.keys(req.body).filter({}.hasOwnProperty.bind(columns));
  //... all the rest of the logic goes here

});

您认为,最干净/最优雅的解决方法是什么?

2 个答案:

答案 0 :(得分:3)

database.showColumns(dbTable)
  .then(columns => this.handleColumns(columns))
  .then(parsedData => this.doSthElse(parsedData);

您可以将逻辑提取为单独的方法。但是,必须在内部调用它,因为它是异步操作完成后触发的回调。

或者,您可以考虑使用生成器,异步/等待函数或promise。

答案 1 :(得分:1)

您可以为此使用异步/等待。

(async function() {
    try {
        var columns = await database.showColumns(dbTable)
        let row = Object.keys(req.body).filter({}.hasOwnProperty.bind(columns));
    } catch (e) {
        console.log("Promise error");
    }
})