node.jsasynchronous/等待使用MySQL
我需要获得所有结果同步,并追加到一个string与asynchronous/等待关键字,如C#
我是新的node.js,我不能适应这个新的语法我的代码。
var string1 = ''; var string2 = ''; var string3 = ''; var string4 = ''; DatabasePool.getConnection(function(err, connection) { connection.query(query,function (err, result) { if (err){}; string1 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); connection.query(query,function (err, result) { if (err){}; string2 = result; }); // i need to append all these strings to appended_text but // all variables remain blank because below code runs first. var appended_text = string1 + string2 + string3 + string4; });
假设你正在使用它的ORM,你可以做这样的事情
async function buildString() { try { const connection = await DatabasePool.getConnection(); const string1 = await connection.query(query); const string2 = await connection.query(query); const string3 = await connection.query(query); const string4 = await connection.query(query); return string1 + string2 + string3 + string4; } catch (err) { // do something } }
任何承诺都可以通过在呼叫前面等待来使用asynchronous/等待。 但是,请注意, 此函数必须在async
函数“包装器”中使用。 你需要处理try/catch
块中的错误。
我也想指出,这4个查询不是同时运行的。 你仍然需要使用Promise.all。
使用mysql2包。 它承诺包装,所以你可以这样做:
async function example1 () { const mysql = require('mysql2/promise'); const conn = await mysql.createConnection({ database: test }); let [rows, fields] = await conn.execute('select ?+? as sum', [2, 2]); }
你将不得不确保你使用的mysql库支持async
/ await
所需的Promises,或者使用像Bluebird的promisifyAll
这样的工具来封装库。
async function appendedText() { const connection = await DatabasePool.getConnectionAsync(); const [string1, string2, string3, string4] = await [ connection.query(query1), connection.query(query2), connection.query(query3), connection.query(query4), ]; return string1 + string2 + string3 + string4; }
请注意,调用appendedText()
实际上会返回一个Promise而不是一个值。
appendedText().then(appended_text => {});