gpt4 book ai didi

javascript - 在 Node.js 中执行顺序操作

转载 作者:行者123 更新时间:2023-12-04 08:04:58 25 4
gpt4 key购买 nike

我用 node.js 为自己构建了一个辅助函数来准备一个数据库,我目前经常在其中更改表结构。所以我在全局对象“表”中定义了我的数据库结构,并通过 sql-queries 使用 mssql 库构建了表。总而言之,它运行得很好。但是我现在在 init 函数的末尾添加了一个 process.exit(1),这表明解释器在不等待 sql-execution 的情况下运行整个操作。如何修改代码,让解释器正确执行所有步骤并在之后退出程序?

const tables = {

table_name_1: {
"key1": "nvarchar(25)",
"key2": "int",
"..": "bit",
},
table_name_2: {
"key1": "int",
"key2": "nvarchar(50)",
"..": "int",
},
table_name_3: {
"key1": "int",
"key2": "int",
"..": "int",
}

}

init_environment();

function init_environment() {

console.log("Init started...");

delete_table(Object.keys(tables));
create_table(Object.keys(tables));

console.log("Init finished");
process.exit(1);
}

function delete_table(tables_to_delete) {

sql.connect(SQL_CONFIG, function () {

for (var i = 0; i < tables_to_delete.length; i++) {

var request = new sql.Request();
var query = "DROP TABLE " + tables_to_delete[i];

request.query(query, function (err, recordset) {
if (err) {
console.log(err);
}
});

}

})

}

function create_table(tables_to_create) {

sql.connect(SQL_CONFIG, function () {

for (var i = 0; i < tables_to_create.length; i++) {

var request = new sql.Request();

var query = "CREATE TABLE " + tables_to_create[i] + " (id INT IDENTITY(1,1) PRIMARY KEY, ";

for (var key in tables[tables_to_create[i]]) {
query += key + " " + tables[tables_to_create[i]][key] + ", ";
}

query += ")";

request.query(query, function (err, recordset) {
if (err) {
console.log(err);
}
});

}

})

}

最佳答案

为此,您应该能够使用 async/await。如果您的 delete_table/create_table 函数返回一个 promise,您可以等待这些函数的结果。
为了演示,我模拟了 sql 函数(以及 process.exit())。您可以看到查询将按顺序运行,然后进程将退出。
事实证明,如果没有传递回调,sql.connect() 和 sql.close() 将返回 Promises。这使得代码更容易编写。
Node.js 代码

const tables = {

table_name_1: {
"key1": "nvarchar(25)",
"key2": "int"
},
table_name_2: {
"key1": "int",
"key2": "nvarchar(50)",
},
table_name_3: {
"key1": "int",
"key2": "int"
}

}

init_environment();

async function init_environment() {

console.log("Init started...");

await delete_table(Object.keys(tables));
await create_table(Object.keys(tables));

console.log("Init finished");
process.exit(1);
}

async function delete_table(tables_to_delete) {
await sql.connect(SQL_CONFIG);
for (var i = 0; i < tables_to_delete.length; i++) {
var query = "DROP TABLE IF EXISTS " + tables_to_delete[i];
await runQuery(query);
}
await sql.close();
}

async function create_table(tables_to_create) {
await sql.connect(SQL_CONFIG);

for (var i = 0; i < tables_to_create.length; i++) {

var query = "CREATE TABLE " + tables_to_create[i] + " (id INT IDENTITY(1,1) PRIMARY KEY, ";

for (var key in tables[tables_to_create[i]]) {
query += key + " " + tables[tables_to_create[i]][key] + ", ";
}

query += ")";

await runQuery(query);
}
await sql.close();
}

function runQuery(query) {
console.log("runQuery: Running query: " + query);
var request = new sql.Request();
return request.query(query);
}
演示片段

/* Mock code */
const SQL_CONFIG = "Some config"
const sql = {
connect(config) {
return new Promise(resolve => setTimeout(resolve, 1000));
},
close() {
return new Promise(resolve => setTimeout(resolve, 1000));
}
}

class Request {
query(query) {
return new Promise(resolve => setTimeout(resolve, 500, null, {}));
}
}

sql.Request = Request;

process = {
exit() {
console.log("Exiting process...");
}
}

/* End Mock code */

const tables = {

table_name_1: {
"key1": "nvarchar(25)",
"key2": "int",
"..": "bit",
},
table_name_2: {
"key1": "int",
"key2": "nvarchar(50)",
"..": "int",
},
table_name_3: {
"key1": "int",
"key2": "int",
"..": "int",
}

}

init_environment();

async function init_environment() {

console.log("Init started...");

await delete_table(Object.keys(tables));
await create_table(Object.keys(tables));

console.log("Init finished");
process.exit(1);
}

async function delete_table(tables_to_delete) {
await sql.connect(SQL_CONFIG);
for (var i = 0; i < tables_to_delete.length; i++) {
var query = "DROP TABLE " + tables_to_delete[i];
await runQuery(query);
}
await sql.close();
}

async function create_table(tables_to_create) {
await sql.connect(SQL_CONFIG);

for (var i = 0; i < tables_to_create.length; i++) {
let lastQuery = i === tables_to_create.length -1;

var query = "CREATE TABLE " + tables_to_create[i] + " (id INT IDENTITY(1,1) PRIMARY KEY, ";

for (var key in tables[tables_to_create[i]]) {
query += key + " " + tables[tables_to_create[i]][key] + ", ";
}

query += ")";

await runQuery(query);
}
await sql.close();
}

function runQuery(query) {
console.log("runQuery: Running query: " + query)
var request = new sql.Request();
return request.query(query)
}

关于javascript - 在 Node.js 中执行顺序操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66261442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com