关于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');
                                });
                            })  
        });
    }
}

看上去 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();

https://www.cnblogs.com/chaoyuehedy/p/10658804.html