1、mysqljs的查询语句,最后一个参数是匿名函数,这个匿名函数为什么不能改变函数体外面的局部变量?如果要改变,如何做:
2、代码如下:
function checkExist(str) {
let rt=0;
if ((typeof(str)!='string' )||(str.length <= 1)) {rt=3 ;}
let query = connection.query(
"SELECT count(1) AS solution from taxlaw_chinatax_js where url like ? ",
[str],
(error, results, fields) => {
if (error) throw error;
let cou = results[0].solution;
console.log(cou);
if ( cou >= 1) {
//console.log("检查数据已经采集过,忽略。");
rt= 2;
} else if (cou < 1) {
//console.log("检查此条不存在,添加开始:" + str);
rt= 1;
}
}
);
//console.log('检查数据库状态错误');
//console.log(query.sql);
return rt;
}
3、匿名函数(error, results, fields) => {}内部的rt值在超出函数的作用域之后,rt的值全部都是0。
实际上应该根据str的数据库查询结果,有的rt是2,有的rt是1,不应该统统是0.
也就是说,匿名函数改变不了外部变量rt的值。
想要改变,如何做?
4、试过直接在匿名函数内部直接返回rt值,也是无用的。代码如下:
function checkExist(str) {
var rt=0;
if ((typeof(str)!='string' )||(str.length <= 1)) {return 3 ;}
connection.query(
"SELECT count(1) AS solution from taxlaw_chinatax_js where url like ? ",
[str],
(error, results, fields) => {
if (error) throw error;
let cou = results[0].solution;
console.log(cou);
if ( cou >= 1) {
//console.log("检查数据已经采集过,忽略。");
return 2;
} else if (cou < 1) {
//console.log("检查此条不存在,添加开始:" + str);
return 1;
}
}
);
//console.log('检查数据库状态错误');
//console.log(query.sql);
return 0;
}
这种情况下,返回的都是0。匿名函数只能返回一层,不能返回两层。
5、改成如下代码:
function checkExist(str) {
var rt=0;
if ((typeof(str)!='string' )||(str.length <= 1)) {return 3 ;}
rt = connection.query(
"SELECT count(1) AS solution from taxlaw_chinatax_js where url like ? ",
[str],
(error, results, fields) => {
if (error) throw error;
let cou = results[0].solution;
console.log(cou);
if ( cou >= 1) {
//console.log("检查数据已经采集过,忽略。");
return 2;
} else if (cou < 1) {
//console.log("检查此条不存在,添加开始:" + str);
return 1;
}
}
);
//console.log('检查数据库状态错误');
//console.log(query.sql);
return rt;
}
返回的是个object,不是具体的数字。
如何做?
数据库操作是异步操作,无法直接return结果的,
如果你能使用es7,可以用async, await来模拟同步
es5的话只能通过回调获得值: