body は、将来まで存在しない値に設定されるためです。
hereは、待機動作が Koa インフラストラクチャによって処理されるyield
一種のキーワードと考えることができます。wait
Promise を生成すると、Koa は Promise が満たされるのを待ってからnext()
、Promise の解決された値を への引数として使用して、ジェネレーターを再度呼び出します (実際には、ジェネレーターに基づいてイテレーターを呼び出します)。next
つまり、割り当てられます。の左側の変数にyield
.
したがって、この場合、DB 呼び出しを行い、結果の promise を Koa に譲り、Koa はそれが満たされるのを待ってから、変数user
に割り当てられた満たされた値を返します。関数は次の yield まで、またはまで実行されます。底から落ちます。
同じリクエストで2 つの非同期タスクを処理する方法を考えると、より明確になる可能性があります。
app.get('/users/:id', function *(next) {
var user = yield User.findOne(this.params.id);
var data = yield someOtherAsynchronousTaskReturningProimse(user);
this.body = data;
});
この場合、「トランポリンで上下にジャンプ」を 2 回行っています。
これをどのように考えるかによって、これを次のようなより読みやすいものとして扱うことができます
function handle(id) {
User.findOne(id)
.then(function(user) {
someOtherAsynchronousTaskReturningPromise(user)
.then(function(data) {
setDataIntoResponse(data);
});
});
}
いわゆる「コルーチン」ベースのアプローチの方がはるかに読みやすいことに同意していただけると思います。このアーキテクチャのもう 1 つの利点は、ミドルウェア/ハンドラーをyield...yield
流行に合わせて記述できることに加えて、返された promise が解決されるのを待っている間に、Koa が他の有用なことを実行できることです。