async-await
на самом деле просто синтаксический сахар для обещаний, он не заставляет асинхронный код выполняться синхронно (то есть он не блокирует выполнение кода). Ваш код эквивалентен следующему:
function sampleFunc() {
return new Promise(function(resolve) {
rp({
uri: 'http://google.com',
jar: true
}).then(function(sample) {
resolve(sample);
});
});
}
function f() {
return new Promise(function(resolve) {
sampleFunc().then(function(result) {
resolve(result);
});
});
}
console.log( f());
(Да, я знаю, что приведенный выше код демонстрирует анти-шаблон. Это только для иллюстрации)
Как видите, функция async
действительно неявно возвращает обещание, которое разрешается со значением, которое вы в конечном итоге возвращаете внутри функции (или отклоняете, если вы throw
что-то) , Именно поэтому async-await
может использоваться только для функций и, следовательно, не применяется на верхнем уровне.
Контекст, вызвавший функцию, совершенно не зависит от того факта, что функция async
, она просто вызывает функцию, возвращает обещание и переходит к следующей строке кода. Ваш console.log()
живет в этом внешнем контексте и видит только обещание, которое было возвращено.