【问题标题】:Query redshift cluster using NodeJs asynchronously使用NodeJs异步查询redshift集群
【发布时间】:2021-10-11 02:10:25
【问题描述】:

我的任务是将几个 redshift 表从集群 1 复制到新集群。 为此,我正在 nodejs 中编写一个脚本。 我正在使用 aws-sdk RedshiftData api 来获取数据。 我有两个单独的查询,我想并行运行。以下是我的代码

class syncRedShiftNodes {
    
    constructor(){ ... }
    
    readDataOne(){
        let newSqlQuery = `select * from ${this.tableName} limit 10`;
        const params = {
          ClusterIdentifier: clusterIdentifier,
          Sql: newSqlQuery,
          Database: database,
          DbUser: dbUser
      };
      return new Promise((resolve, reject)=>{
        return awsRedshift.executeStatement(params, function(err, res){
                if (err) console.log(err, err.stack); // an error occurred
                else{
                    return awsRedshift.getStatementResult({Id:res.Id}, function(error, data){
                        if (error) console.log(error, error.stack); // an error occurred
                        else  return data;
                    });
                }
            });
      });
    }

   readDataTwo(){ ...//identical to above function except the query }

   main(){
       return Promise.all([this.readDataOne(), this.readDataTwo()])
         .spread((data1, data2)=>{
            console.log("promise resolved!!");
            return true;
   }
}

问题是我的代码从未达到“承诺已解决”日志。如果我在 redshift getStatementResult 的回调中添加日志,则打印正确,但我的句柄从未达到 promise.all().then 语句,我无法理解为什么会这样。

我想到的另一个问题是在类中使用这种模式是一种好习惯吗?

【问题讨论】:

    标签: node.js amazon-web-services asynchronous promise amazon-redshift


    【解决方案1】:

    你没有在课堂上解决或拒绝你的承诺。

    以下示例

    class syncRedShiftNodes {
      constructor() {}
    
      readDataOne() {
        let newSqlQuery = `select * from ${this.tableName} limit 10`;
        const params = {
          ClusterIdentifier: clusterIdentifier,
          Sql: newSqlQuery,
          Database: database,
          DbUser: dbUser,
        };
        return new Promise((resolve, reject) => {
          awsRedshift.executeStatement(params, function (err, res) {
            if (err) {
              console.log(err, err.stack);
              reject(err);
            } else {
              awsRedshift.getStatementResult(
                { Id: res.Id },
                function (error, data) {
                  if (error) {
                    console.log(error, error.stack);
                    reject(error);
                  } else {
                    resolve(data);
                  }
                }
              );
            }
          });
        });
      }
    
      readDataTwo() {}
    
      async main() {
        try {
          const result = await Promise.all([
            this.readDataOne(),
            this.readDataTwo(),
          ]);
          return result;
        } catch (err) {
          console.log(err);
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 1970-01-01
      • 2018-08-16
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      相关资源
      最近更新 更多