我最近开始学习 javascript,但在理解该语言的异步行为方面遇到了很大的问题。我花了数百个小时进行搜索,每个人都建议使用 Promise,但我不太明白我做错了什么(也许全部都错了,哈哈)。
我尝试了每个论坛中几乎每个人都推荐的 Promise,并想出了这段代码,但不知何故,我无法让它等待 function1 在 function2 中完成,因为我知道 Promise1 是未定义的。
async function function1() {
let query = "SELECT * FROM table1";
connection.query(query, (error, result) => {
if (error) throw error;
console.log("Length " result.rows.length);
let result_query = [];
let i = 0;
while (i < result.rows.length) {
result_query.push(result.rows[i]);
i++;
}
let customPromise = new Promise((resolve, reject) => {
if(result_query.length > 0){
resolve(result_query);
} else {
reject(new Error('ERROR'))
}
});
customPromise.then(() => {
return customPromise;
});
};
async function function2() {
promise1 = await function1();
promise1.then(function(){ //HERE I GET THAT PROMISE1 IS UNDEFINED
console.log("Exit");
})
}
这是我的原始代码,我意识到 javascript 具有异步性质,并且它在 function1 完成之前在 function2 中打印“Exit”。如果这是一个显而易见的问题,我很抱歉,但我感到很困惑。谢谢大家帮助陌生人的善意。
async function function1() {
let query = "SELECT * FROM table1";
connection.query(query, (error, result) => {
if (error) throw error;
console.log("Length " result.rows.length); //*THIS PRINTS AFTER THE EXIT IN FUNCTION2
let result_query = [];
let i = 0;
while (i < result.rows.length) {
result_query.push(result.rows[i]);
i++;
}
if(result_query.length > 0){
return(result_query);
} else {
return("ERROR");
}
};
async function function2() {
function1();
console.log("Exit"); //*THIS PRINTS BEFORE EVERYTHING
}
OUTPUT:
> Exit
> Length 2
connection.query(query, (error, result) => {
if (error) throw error;
console.log("Length ", result.rows.length);
let result_query = [];
let i = 0;
while (i < result.rows.length) {
result_query.push(result.rows[i]);
i++;
}
});
这段代码正在为其异步代码使用回调。如果你想将其转换为 Promise,你可以这样做:
const promise = new Promise((resolve, reject) => {
connection.query(query, (error, result) => {
if (error) reject(error);
else resolve(result);
});
})
const result = await promise;
然后你可以用 while 循环来构建
result_query
,但这实际上并不需要。 result.rows 已经包含您需要的内容,并且不需要将其复制到另一个数组。所以完整的功能是:
async function function1() {
let query = "SELECT * FROM table1";
const promise = new Promise((resolve, reject) => {
connection.query(query, (error, result) => {
if (error) reject(error);
else resolve(result);
});
});
const result = await promise;
if (result.rows.length > 0) {
return result.rows;
} else {
return "ERROR";
}
}
然后要使用它,你可以这样做:
async function function2() {
const rows = await function1();
console.log("Exit");
}