// 报错信息
(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();