我有這個:
function afterCreateThePayment(req, res, rows) {
for (var i = 0; i < rows.length; i ) {
console.log(rows.length)
var selecter = "SELECT * from SCHEDULE WHERE CLIENT_USERNAME = ? AND SESSION_STATUS = ?"
//pass rows into this function
mysqlconn.connect(function(err) {
if (err) {
console.error('Database connection failed: ' err.stack);
return;
}
mysqlconn.query(selecter, [rows[i]["USERNAME"], 'CONFIRMED'], async function(err, scheduleData) {
if (err) {
console.log(err);
}
for (var x = 0; x < scheduleData.length; x ) {
console.log(scheduleData[x])
}
// mysqlconn.end();
})
})
}
}
如您所見,我正在傳遞rows給這個函式,然后嘗試將其rows[i]["USERNAME"]用作查詢引數之一。但是,當我這樣做時,我得到了錯誤
TypeError: Cannot read property 'USERNAME' of undefined
所以我不確定在這里做什么,或者我的邏輯是否正確。有人可以幫忙嗎?
uj5u.com熱心網友回復:
您的問題是他的回圈變數i的范圍為afterCreateThePayment. 請記住,var在 javascript 中使用函式范圍,這與您可能熟悉的 C 風格語言中的塊范圍不同。
我假設來自的回呼mysqlconn.connect是異步的。這意味著回圈繼續執行,遞增i。到回呼發生時,回圈已超出范圍。如果您在回呼中查看i(not rows) 的值,您會看到發生了什么。
這是一個類似的例子:
for (var i = 0; i < 5; i )
{
function internal()
{
console.log(i);
}
setTimeout(() => {internal();},1000);
}
最簡單的選擇是將var i回圈中的let i. 進行此更改將使i塊作用于范圍,因此該值將僅適用于您當前對mysqlconn.connect. 在我的示例中,這很簡單:
for (let i = 0; i < 5; i )
{
function internal()
{
console.log(i);
}
setTimeout(() => {internal();},1000);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/421508.html
標籤:
