Цепочка в соответствии с этим синтаксисом:
this.doSomethingChained(1).doSomethingChained(2)
... по определению является синхронной: JavaScript будет оценивать аргументы и вызовы функции синхронно;с этим ничего не поделаешь.Так что этот синтаксис просто не подходит для асинхронного кода.
Асинхронный код по своей природе опирается на обратные вызовы.Даже обещания включают асинхронное выполнение обратных вызовов.С await
это менее заметно, но, тем не менее, контекст выполнения соответствующей функции async
восстанавливается асинхронно, продолжая выполнение после разрешения await
.
К вашему вопросу:
Я не понимаю, почему this.a
работает, но return
это не так.
return this
работает , но по спецификации значение, предоставляемое с оператором return
в функции async
, определяет обещанное значение ,не return значение doSomethingChained
, поскольку async
функция всегда возвращает обещание (синхронно).
Итак, в вашем коде (синхронно!) Возвращаемое значение doSomethingChained
является обещанием, а не this
.Это объясняет, почему вы получаете ошибку.
Обратите внимание, что функция async
не очень полезна, когда она не имеет await
.Без него вы могли бы также использовать обычную функцию.