Javascript 等待它解决承诺,然后整齐地插入
我整个上午都在看,因为这个代码对我不起作用 我希望一旦承诺得到解决,“then”得到最后一个插入的ID(承诺),并整齐地插入到另一个表中。目前先画出所有的承诺,然后才是乱七八糟Javascript 等待它解决承诺,然后整齐地插入,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我整个上午都在看,因为这个代码对我不起作用 我希望一旦承诺得到解决,“then”得到最后一个插入的ID(承诺),并整齐地插入到另一个表中。目前先画出所有的承诺,然后才是乱七八糟 con.query(“从wp中选择ID_posts ORDER BY ID DESC LIMIT 0,1;”,函数(err,result,fields){ 控制台日志(结果); 对于(var i=0;i{ con.query(sql、变量、(错误、结果、字段)=>{ 如果(错误){ 退货拒绝(err); } 返回解析({
con.query(“从wp中选择ID_posts ORDER BY ID DESC LIMIT 0,1;”,函数(err,result,fields){
控制台日志(结果);
对于(var i=0;i
因此,撇开SQL注入漏洞不谈,您可能会更好地使用promisifiedcon.query
函数,这里称为queryP()
我不确定我是否能够捕获您代码的原始逻辑,因为它正在重用结果
,等等,但这个想法应该存在
请注意,如果多个并发请求修改了wp\u posts
,您正在修改的post id可能会更改。您可能需要更改
函数queryP(con,sql,variables=[]){
返回新承诺((解决、拒绝)=>{
con.query(sql、变量、(错误、结果、字段)=>{
如果(错误){
退货拒绝(err);
}
返回解析({result,fields});
});
});
}
异步函数processDataThing(con、result、dataThing){
var source=dataThing[“source”];
var text=dataThing[“text”];
var-quality=dataThing[“quality”];
常数r1=等待查询(
骗局
“插入'wp_posts'”(`post\u author`、`post\u date`、`post\u date\u gmt`、`post\u title`、`post\u extract`、`post\u status`、`comment\u status`、`ping\u status`、`post\u password`、`post\u name`、`to\u ping`、`post\u modified`、`post\u modified`、`post\u modified\u gmt\u`、`post\u内容过滤`、`post\u父项`、`guid`、`菜单顺序`、`post\u类型`、`post\u类型`、`mime`注释值1+
福霍伊+
"', '" +
福霍伊+
"', '', '" +
制造+
“发布”、“关闭”、“关闭”、“关闭”+
制造+
"','','', '" +
福霍伊+
"', '" +
福霍伊+
"','', '" +
结果[0]。ID+
“,”,“,”,“0”,“dt_链接”,“,”,0);“,
);
console.log(“1 registro link insertado”);
常数r2=等待查询(
骗局
“从wp_帖子中选择ID,其中post_type='dt_links'按ID顺序描述限制为0,1”,
);
常数result2=r2.result;
常数r3=等待查询(
骗局
在wp_postETA(post_id,meta_key,meta_value)值中插入('+
结果2[0]。ID+
“,”地址“,”+
来源+
"'),(" +
结果2[0]。ID+
“,”类型“,”+
正文+
"'),(" +
结果2[0]。ID+
“好的,好的,好的”+
品质+
"');",
);
}
// ...
异步函数doThings(con,getData){
const{result}=await queryP(con,“按ID DESC从wp_posts中选择ID
限值0.1“;
constdatathingpromises=getData.map(dataThing=>processDataThing(con,result,dataThing));
返回等待承诺。全部(数据内容承诺);
}
// ...
doThings(con,getData)。然后(()=>console.log(“全部完成”);
以下是一个示例,说明如果您使用mysql2内置的基于承诺的界面来正确排序所有操作,事情会变得多么干净:
// using mysql2/promise
// parent function must be declared async
try {
let posts = await con.query("SELECT ID FROM wp_posts ORDER BY ID DESC LIMIT 0,1;");
console.log(posts);
for (const post of posts) {
const source = post.source;
const text = post.text;
const quality = post.quality;
let sql = "INSERT INTO `wp_posts` ( `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,`post_excerpt`, `post_status`,`comment_status`, `ping_status`,`post_password`, `post_name`,`to_ping`,`pinged`, `post_modified`, `post_modified_gmt`,`post_content_filtered`,`post_parent`, `guid`,`menu_order`, `post_type`, `post_mime_type`,`comment_count`) VALUES (1, '" + fhoy + "', '" + fhoy + "', '', '" + make + "','', 'publish', 'closed', 'closed','','" + make + "','','', '" + fhoy + "', '" + fhoy + "','', '" + posts[0].ID + "','','0', 'dt_links','' ,0);";
await con.query(sql);
console.log("1 registro link insertado");
let result = con.query("SELECT ID FROM wp_posts WHERE post_type='dt_links' ORDER BY ID DESC LIMIT 0,1;")
console.log(result);
sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (" + result[0].ID + ",'_dool_url', '" + source + "'),(" + result[0].ID + ",'_dool_type','" + text + "'),(" + result[0].ID + ",'_dool_quality','" + quality + "');";
await con.query(sql);
console.log("1 registro link meta insertado");
}
} catch(e) {
// handle all db errors here
}
这不仅使阅读和理解简单得多,而且还对每个数据库操作进行排序,并将所有错误处理收集到一个位置(以前基本上没有错误处理)
更改列表:
async
和await
使异步数据库操作的排序更易于编码try/catch
在一个位置捕获并处理所有数据库错误(您以前没有合理的错误处理)for/of
,这是迭代数组更方便的方法var
声明替换为const
或let
,视情况而定getData[i][“quality”]
切换到getData[i].quality
,因为它更简单,并且简单属性名周围不需要引号和括号for
循环中的第一个查询每次都是完全相同的。这似乎不正确。原始查询中对结果的唯一引用是res