2016-10-19 10 views
2

私は私の頭をラップトラブルを抱えている周りの非同期/のawait構文非同期/待つ予想される動作

このコードでは、「接続」しても、コンソールにログインしますない理由私は何を把握することができないようすることですmysqlへの接続にエラーがあるとき。

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

答えて

3

async function sがまだ非同期である、彼らは何かをブロックしませんか魔法のように、彼らが戻る前に待つことを覚えておいてください。 connect()を常にと呼ぶと約束はであり、いつも真実であるので、すべての場合に直ちに「接続済み」が記録されます。あなたが接続を待機する場合

、あなたはawaitに結果を持っていますし、同様にasync functionif声明をラップ:

async function connect() { 
    try { 
     await connection(); 
     return true; 
    } catch (e) { 
     console.error(e); 
     return false 
    } 
} 

(async function() { 
    if (await connect()) { 
//  ^^^^^ 
     console.log('connected'); 
    } 
}()); 
+0

ありがとうございました。私は、非同期関数が返すことを約束していません。私はこれがプロミスよりずっと優れているかどうか分からない。パラダイムだ。 – richbai90

+0

@ richbai90これは、 'then'呼び出しを入れ子にすることなく制御構造を使用できるようにする文法的な砂糖です。しかし、セマンティクスは同じです。 'await'なしでどのように見えるかについては、下記のnem035の答えを参照してください。 – Bergi

1

非同期機能が約束ので、この

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().then(isConnected => { 
    if (isConnected) { 
    console.log('connected'); 
    } 
}); 

また、connect()から返された約束を待つことができます.Bergi demonstrated in his answerです。

関連する問題