Использование 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
.
Это то, что вы хотели бы видеть больше, или я просто сошел с ума? Я хотел бы услышать ваши мысли.