Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步/等待预期行为_Javascript_Async Await - Fatal编程技术网

Javascript 异步/等待预期行为

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

我很难理解异步/等待语法

我似乎不明白的是,为什么在这段代码中,即使与mysql的连接出现错误,也会将“connected”记录到控制台上

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');
  }
});