私はこれをテストするためにエクスプレスの外にシンプルなスクリプトを用意しています。しかし、次のコードは私の期待を満たしていないようです。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)
}
})
})
}
(もちろん、私は約束の拒否に対処するために試しキャッチを持っていないことを知っています。 )
'getTest()'は約束を返します。あなたはそれを呼び出していますが、 '.then()'または 'await'を使用して、約束が終わるのを待つことはありません。したがって、 'getTest()'が終了する前に 'res.send()'を呼び出してください。実際に約束が解決するのを実際に待つには、 'await getTest()'または 'getTest()。then()'を使う必要があります。 'await getTest()'を使うと、その関数を 'async'として宣言する必要があります。 – jfriend00
私は今それを得ると思います。同期動作を作成するのが効果的である場合、非同期関数である必要があるということは奇妙なことです。 – bluejack