javascript - 一次等待一个查询

标签 javascript node.js sql-server asynchronous async-await

所以我尝试使用nodejs和mssql构建一个顺序链插入数据库。以下是快速概述:

  1. 插入条件表
  2. 插入任务表

等等..

这是我的代码:

    var PODKEY = process.env.PODKEY;
var ADDBY = process.env.ADDBY;
var dateTimeNow = new Date(Date.now()).toISOString().replace(/Z$/, "");

(async function () {
    try {
        DecryptConnectionString(connectionString, 'ProductIpsMasterConnectionString')
            .then(async function () {
                let connectionConfigurationObject = await BuildConnectionConfigurationObject(connectionString);
                await sql.connect(connectionConfigurationObject).then(async function () {
                    GetTenantsInfoByPodKey(PODKEY).then(async function (resultTenantsInfo) {
                        resultTenantsInfo.forEach(async function (tenant) {
                            var transaction = new sql.Transaction();
                            await transaction.begin(async function () {

                                let tenantConnectionConfigurationObject = await BuildConnectionConfigurationObject(tenant.CONNECTIONSTRING);

                                await sql.connect(tenantConnectionConfigurationObject).then(async function () {
                                    console.dir("Connected to Tenant ID: " + tenant.TENANTID);
                                    await InsertCondition(transaction).then(async function (resultCondition) {
                                        console.log("Successfully Inserted, Condition Key: " + resultCondition[0].conditionKey);
                                        await InsertTask(transaction, resultCondition[0].conditionKey).then(async function (resultTask) {
                                            console.log("Successfully Inserted, TaskKey: " + resultTask[0].taskKey);
                                            transaction.commit();
                                        });

                                    }).catch(function (err) {
                                        console.error("Error Inserting Condition: " + err);
                                    });
                                }).catch(function (err) {
                                    console.error("Error connecting to Tenant DB: " + err);
                                });

                            });
                        });
                    }).catch(function (err) {
                        console.error("Error getting Tenants Info: " + err);
                    });
                }).catch(function (err) {
                    console.log('error connecting to Master DB:' + err);
                });
                console.dir("Connected Successfully to Master DB!");
            }).catch(function (err) {
                console.log('error decrypting connection string :' + err);
            });

    } catch (err) {
        console.error("Error Occured: " + err);
    }
})()

function GetTenantsInfoByPodKey(transaction, podKey) {
    return new Promise(function (resolve, reject) {
    new sql.Request(transaction).query(query).then(function (recordset) {
        resolve(recordset)});
    });
}

function InsertCondition(connectionObject, transaction) {
    return new Promise(function (resolve, reject) {
       var query = "insert into table(col1,col2..) values (val1,val2,..);select SCOPE_IDENTITY() AS conditionKey;"
       new sql.Request()
               .query(query, (err, recordset) => {
                resolve(recordset);
                });
     });
}

 function InsertTask(connectionObject, transaction) {
    return new Promise(function (resolve, reject) {
       var query = "insert into table(col1,col2..) values 
   (val1,val2,..);select SCOPE_IDENTITY() AS taskKey;"
       new sql.Request()
               .query(query, (err, recordset) => {
                resolve(recordset);
                });
     });
}

假设查询工作正常并插入,但我对 forEach 有问题,即使我做了 for() 循环,它也没有完成 sql.connect 并且内部方法“InsertCondition”它触及它,但看起来像那样它会跳过整个 sql.connect block 并继续下一次迭代。

问题: 1.) 我怎样才能正确地使用await来制作GetTenantsInfoByPodKey()、sql.connect和InsertCondition()?等待每个方法先完成然后再进行下一个? [已解决]

2.)当我手动查询它时,它没有反射(reflect)在数据库中,但它返回从 SCOPE_IDENTITY() 插入的键 Insert and committ 我怎样才能确保它插入了?就像它首先提交 InsertCondition() 然后提交 InsertTask()

中的下一个方法

这是我正在尝试的完整应用程序: https://jsfiddle.net/25serz3c/1/

谢谢

最佳答案

async function f () {

    for(const tenant of resultTenantsInfo) {
      const connectionObjTenant = BuildConnectionConfigurationObject(tenant.CONNECTIONSTRING);
      await sql.connect(connectionObjTenant);
      const transaction = new sql.Transaction();
      awai transaction.begin()
      const resultCondition = await InsertCondition(transaction)
      console.log("Inserting Condition was successfull. Condition Key: " + resultCondition[0].conditionKey);
      await transaction.commit();
      console.dir("Transaction commited.");
    }
}

f()

关于javascript - 一次等待一个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55944326/

相关文章:

javascript - 使用 mongoose 按 Id 删除对象

javascript - Knockout JS - 多维 observableArrays 和显示子数组数据

javascript - 如何解析 "Firefox can' t 建立与 127.0.0.1 :8081"处服务器的连接

sql - 根据连接的值将连接结果添加为新列

sql-server - 在sql server存储过程中插入外键值

java - 表中的更多名称属性

javascript - 使用高阶函数的 N*N 大小的单位矩阵

javascript - 使用 d3.js、node.js、postgresql 显示动态直方图

javascript - Node NPM - 安装与安装 -g

node.js - 如何在 Windows 7 中安装和使用 Bower