Javascript 等待它解决承诺,然后整齐地插入

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); } 返回解析({

我整个上午都在看,因为这个代码对我不起作用

我希望一旦承诺得到解决,“then”得到最后一个插入的ID(承诺),并整齐地插入到另一个表中。目前先画出所有的承诺,然后才是乱七八糟

con.query(“从wp中选择ID_posts ORDER BY ID DESC LIMIT 0,1;”,函数(err,result,fields){
控制台日志(结果);
对于(var i=0;i
因此,撇开SQL注入漏洞不谈,您可能会更好地使用promisified
con.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
}
这不仅使阅读和理解简单得多,而且还对每个数据库操作进行排序,并将所有错误处理收集到一个位置(以前基本上没有错误处理)

更改列表:

  • 切换到mysql2/promise,这样我们就可以使用内置的promise接口
  • 使用
    async
    await
    使异步数据库操作的排序更易于编码
  • 使用
    try/catch
    在一个位置捕获并处理所有数据库错误(您以前没有合理的错误处理)
  • 切换到
    for/of
    ,这是迭代数组更方便的方法
  • 将所有
    var
    声明替换为
    const
    let
    ,视情况而定
  • 将语法从
    getData[i][“quality”]
    切换到
    getData[i].quality
    ,因为它更简单,并且简单属性名周围不需要引号和括号
  • 未决问题:

  • for
    循环中的第一个查询每次都是完全相同的。这似乎不正确。原始查询中对
    结果的唯一引用是
    res