我想要实现的:
- 收集艺术家ID
- 在数据库中查找它们
- 或者创建它们
- 在数据库中创建一个事件,获取事件ID
- 等待直到收集完艺术家和事件ID
- 现在循环处理每个艺术家和事件组合
我得到了以下代码:
我正在使用Node和MySQL。为了插入关系,我必须等待艺术家的插入或创建。我尝试使用以下代码完成:
let promises = [];
if (artists.length != 0) {
for (key in artists) {
promises.push( find_artist_id_or_create_new_artist(artists[key]) )
}
}
await Promise.all(promises);
返回id:
async function find_artist_id_or_create_new_artist(artist_name) {
return await find_artist_return_id(artist_name, create_artist_return_id)
}
寻找一位艺术家:
async function find_artist_return_id(artist_name, callback) {
var sql = "SELECT * FROM `artists` WHERE `name` LIKE "+con.escape(artist_name)+" LIMIT 1;"
con.query(sql, (err,row) => {
if(err) throw err;
if (row.length == 0) {
return callback(artist_name)
} else {
return row[0].id
}
});
}
创造一个艺术家
async function create_artist_return_id(artist_name) {
var sql = "INSERT INTO `artists` (`id`, `name`, `meta_1`, `meta_2`) VALUES (NULL, "+con.escape(artist_name)+", NULL, NULL)";
con.query(sql, (err, result) => {
if(err) throw err;
return result.insertId
});
}
我明白在con.query函数中无法返回,但我不知道如何正确设置代码以完成此操作。感激提供回答的链接或搜索方法。
SQL函数
需要被转换为promises
以便能够被awaited
。 - Arman Charanawait
可以等待任何 Promise,async
只是使函数返回一个Promise
的一种方式,但如果在此函数内部使用回调函数,则会破坏 Promise。因此,在上述情况下,如果您只使用 mySQL 的 Promise 版本,则应该这样做 ->var result = await con.query(sql)
,基本上不使用回调函数。 - Keith