Javascript 异步/等待预期行为
我很难理解异步/等待语法 我似乎不明白的是,为什么在这段代码中,即使与mysql的连接出现错误,也会将“connected”记录到控制台上Javascript 异步/等待预期行为,javascript,async-await,Javascript,Async Await,我很难理解异步/等待语法 我似乎不明白的是,为什么在这段代码中,即使与mysql的连接出现错误,也会将“connected”记录到控制台上 mongoose.Promise = Promise; function connection() { //return a promise to be consumed in an async function return new Promise((resolve, reject) => { mongoose.con
mongoose.Promise = Promise;
function connection() {
//return a promise to be consumed in an async function
return new Promise((resolve, reject) => {
mongoose.connect('mongodb://localhost/testdatabase');
let db = mongoose.connection;
let sw = mysql.createConnection({
host: 'localhost',
user: 'reporting',
Promise: Promise,
database: 'testdatabase'
});
//Only resolve if both database connections are made successfully
sw.then(() => {
db.on('error', (err) => {
reject(err);
});
db.once('open', () => {
resolve(db);
});
}).catch((e) => {
reject(e);
})
});
}
//Await connection and return true or false for more synchronous code style
async function connect() {
let connected = false;
try {
//should pause execution until resolved right?
await connection();
connected = true;
} catch (e) {
//Makes it here successfully
console.error(e);
connected = false
} finally {
return connected
}
}
if (connect()) {
//This code also gets fired?
console.log('connected');
}
请记住,
async函数
s仍然是异步的,它们不会阻塞任何内容或神奇地等待返回。调用connect()
如果要等待连接,则必须等待
结果,并将If
语句包装在异步函数中
:
async function connect() {
try {
await connection();
return true;
} catch (e) {
console.error(e);
return false
}
}
(async function() {
if (await connect()) {
// ^^^^^
console.log('connected');
}
}());
异步函数返回承诺,因此
if (connect()) { // <--- connect() will return a promise
// and a promise always evaluates to a truthy value,
// that's why this code always runs
console.log('connected');
}
或者您也可以等待从connect()
以及Bergi返回的承诺。谢谢,我没有意识到异步函数返回的承诺本身。我不确定这比Promise.then范例好多少。@richbai90它只是一种语法糖,允许在不嵌套然后调用的情况下使用控制结构。但是,语义保持不变。请参阅下面的nem035答案,了解在没有wait
的情况下它的外观。
connect().then(isConnected => {
if (isConnected) {
console.log('connected');
}
});