【发布时间】:2019-07-24 18:17:22
【问题描述】:
我有一个函数可以从 mysql 数据库中检索用户 ID 列表。
function GetUsers(callback) {
UpdateLogFile('Function Call: GetUsers()')
var users = []
Database.execute( connectionStr,
database => database.query('select UserID from Users')
.then( rows => {
for (let i = 0; i < rows.length; i++){
users.push(rows[i].UserID)
}
return callback(users)
})
).catch( err => {
console.log(err)
})
}
供参考:
数据库类来自here
const mysql = require( 'mysql' )
class Database {
constructor( config ) {
this.connection = mysql.createConnection( config )
}
query( sql, args ) {
return new Promise( ( resolve, reject ) => {
this.connection.query( sql, args, ( err, rows ) => {
if ( err )
return reject( err )
resolve( rows )
})
})
}
close() {
return new Promise( ( resolve, reject ) => {
this.connection.end( err => {
if ( err )
return reject( err )
resolve()
})
})
}
}
Database.execute = function( config, callback ) {
const database = new Database( config )
return callback( database ).then(
result => database.close().then( () => result ),
err => database.close().then( () => { throw err } )
)
}
经过数小时了解承诺和回调,我终于能够让GetUsers() 至少工作并返回我正在寻找的东西。但是,我似乎只能这样使用它:
GetUsers(function(result){
// Do something with result
})
但我真的很想在函数中有一个传统的 return 语句,这样我就可以像这样使用它:var users = GetUsers()。我看到帖子说由于异步函数的性质这是不可能的,但我仍然充满希望,因为我真的希望能够避免callback hell。我尝试了下面的代码,但“用户”在执行后只是未定义的结果。因此,我的主要目标是能够从GetUsers() 获取返回值,而无需将回调链接在一起,因为我还有其他行为类似的函数。这可能吗?
var users
GetUsers(function(result){
users = result
})
console.log(users)
【问题讨论】:
-
使用 Promise 代替,
awaitit
标签: mysql node.js asynchronous callback