Использование Promises, Proxy и async/await, о боже!

В последнее время я работаю над перестройкой node.js API от Neovim. Примерный интерфейс будет примерно таким:

Мы можем сделать его немного более читабельным и сгладить, используя async и await (представленные в узле 7). Вы также можете узнать больше об этом из этого поста: Async/await в ES2017 — лучшее, что когда-либо случалось с JavaScript.

Это отличное начало, но как мы можем его подсластить? Начнем с изменения getBuffer и getLines на геттеры.

Хорошо, а что, если бы нас интересовал только lines?

Потрясающе, правда? Что ж, круто, пока вы не попытаетесь запустить этот код, и он не сработает. Можете ли вы определить проблему? nvim.buffer возвращает Promise, и мы пытаемся получить доступ к свойству lines Promise, а не к разрешенному значению промиса. Это было бы эквивалентно этому (используя наш первый пример с промисами).

Так что мы можем сделать? Один из вариантов состоит в том, чтобы Neovim.getBuffer возвращал класс с интерфейсом Buffer и Promise. Другой вариант, который приходит на ум, — использование Прокси.

На данный момент отложить детали реализации в сторону, это хорошая идея? Это кажется очень «не-javascript», но, может быть, это и хорошо. Вы можете скрыть цепочку промисов от своего потребителя API, но это может вызвать путаницу, поскольку явно не ясно, что каждый из этих вызовов возвращает Promise.

Это то, что вы хотели бы видеть больше, или я просто сошел с ума? Я хотел бы услышать ваши мысли.