hasValue('isLoggedIn')) { // pass the individual promises from generateHttpBody() through using `yield from` // when generateHttpBody() finishes we get its return result in $body $rawHtmlBody = yield from generateHttpBody($request); } else { $response->setStatus(301); $response->setHeader("Location", "http://domain.com/login"); $rawHtmlBody = ''; } $response->send($rawHtmlBody); } function generateHttpBody(Request $request, Session $session) { // returns a promise; pause here until the promise resolves. // this promise is passed through transparently inside myHttpHandler() // because we used `yield from` there. $user = yield loadUserFromDatabase($session->getValue('userId')); // Another promise -- again, this is passed through transparently // because we used `yield from` in myHttpHandler() $template = yield loadTemplateFromRedis($request->getUriPath()); // ... do some stuff here to set template values ... // return $rawHtmlBody; } // And above this layer in the HTTP server code: // $promise = coroutine(myHttpHandler($request, $response)); // $promise->when(...); // we know the response completed here