无禅可参 2020-03-18 02:31 采纳率: 50%
浏览 357
已采纳

关于for循环异步操作的问题

定义了async函数,await第一个异步操作(里面嵌套第二个异步),for循环两遍报错

// 报错信息
(node:5020) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'webContents' of undefined

源代码

async function fun1(connection){
    for(let i = 1; i<=2;i++){
##  // **这是第一个异步 查询数据库**
        let sqlstr = `select bookurl from bookurl where id = "${i}"`;
    // 这个 await 等待执行完成
        await connection.query(sqlstr,function(err,results,fields){
            if(err){console.log(err);} 
            console.log(results[0].bookurl);
##           // **第一个异步里嵌套第二个异步**
                nightmare
                            .goto('http://www.xxx.com/'+results[0].bookurl,{})
                            .inject('Js', 'jquery-1.2.6.js')
                            .wait(function(){
                                window.book = [];
                                return true;
                            })
                            .evaluate(function(){
                                    // test
                                    return window.book;
                            })
                            .end()
                            .then(function(results){
                            // 插入数据库
                                let sql11 = `insert into bookinfo values(null,"${results[0]}"`;
                                connection.query(sql11,function(err,results,fields){
                                    if(err){console.log(err);}
                                    console.log('success');
                                });
                            })  
        });
    }
}
  • 写回答

2条回答 默认 最新

  • Todd_Pointer 2020-03-19 17:46
    关注

    看上去 await connection.query.... 并不会 wait。

    connection.query 看上去是一个 nodejs 传统的回调式异步方法,
    而不是一个返回 Promise 的 async/await 兼容的异步方法

    const {results, fields} = await new Promise((resole, reject)=> { // (假装)等待resolve/reject被调用
        connection.query(...., function( error, results, fields) {
            if(error) reject(error); // await 会抛出异常
            else resolve({results, fields}); // await 会返回 {results, fields}
        });
    });
    // do something with results/fields
    

    nightmare.end() 看上去返回一个 Promise,应该可以被 await:

    const results = await nightmare.goto(...).inject(....).wait(....).evaluate(....).end();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错
  • ¥15 高缺失率数据如何选择填充方式
  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?