2017-09-12 14 views
0

私はこれをテストするためにエクスプレスの外にシンプルなスクリプトを用意しています。しかし、次のコードは私の期待を満たしていないようです。async /ノード/エクスプレスで待ち受けていないとプロミスが解決するのを待たずにいる

コード

async function getTest(type, key) { 
    var body = await tloader.pload(type, key) 
    console.log(body) 
    return body 
} 

router.get('/pages/test', function(req, res) { 
    console.log("Running test...") 
    var content = getTest('tplt', 'primary') 
    console.log(content) 
    res.send(content) 
    console.log(content) 
}) 

コンソールログ:

Promise { <pending> } 
Promise { <pending> } 
<html> 
    <head> 
    </head> 
    <body> 
    <p>Hello World - I love you all! It works!</p> 
    </body> 
</html> 

が約束のみ、それが何のために{} object

として送信されたコンテンツを(送信した後に解決され価値があるとすれば、約束を含むコードは:

です
var pload = function(type, tname) { 
    return new Promise(function(resolve, reject) { 
     var key = keybase + type + ":" + tname 
     rcli.get(key, function(err, res) { 
      if (err) { 
       reject(err) 
      } else { 
       resolve(res) 
      } 
     }) 
    }) 
} 

(もちろん、私は約束の拒否に対処するために試しキャッチを持っていないことを知っています。 )

+3

'getTest()'は約束を返します。あなたはそれを呼び出していますが、 '.then()'または 'await'を使用して、約束が終わるのを待つことはありません。したがって、 'getTest()'が終了する前に 'res.send()'を呼び出してください。実際に約束が解決するのを実際に待つには、 'await getTest()'または 'getTest()。then()'を使う必要があります。 'await getTest()'を使うと、その関数を 'async'として宣言する必要があります。 – jfriend00

+0

私は今それを得ると思います。同期動作を作成するのが効果的である場合、非同期関数である必要があるということは奇妙なことです。 – bluejack

答えて

4

async機能は基本的に「約束」です。

router.get('/pages/test', function(req, res) { 
    console.log("Running test...") 
    getTest('tplt', 'primary').then(content => { 
    console.log(content) 
    res.send(content) 
    console.log(content) 
    }); 
}) 

また、あなた急行コールバックで非同期/のawaitを使用することができ、私はそれをどのように処理するかを明示わからないことがあります。

router.get('/pages/test', async function(req, res) { 
    console.log("Running test...") 
    const content = await getTest('tplt', 'primary'); 
    console.log(content) 
    res.send(content) 
    console.log(content) 
}) 
+0

これはうまくいきます...ありがとうございます。しかし:私はなぜそこで動作し、私のgetTest関数ではないのですか?それはまた、機能内でプロミスが解決するのを待つのを待つのを待っており、コンソールは未解決の約束事を記録します。 これは一時的な、または偶発的な修正であると心配しています... – bluejack

+3

'async'関数は明示的にうまく動作しますが、' next() '引数を受け入れなければ、レスポンスを処理する必要がありますそれは通常の機能にも必要です。 –

関連する問題