#javascript
Вопрос:
Я ищу способ вызвать метод «неявно» после цепочки (шаблон свободного интерфейса).
У меня уже есть что-то вроде
class Foobar { methodA() { // update state return this; } methodB() { // update state return this; } applyChanges() { // persist the state at this point } }
И об использовании:
new Foobar().methodA().methodB().applyChanges();
Дело в том, что я заранее не знаю, будут ли пользователи класса использовать только один или два метода цепочки (или даже ноль), и для «опыта разработчика» я не хотел раскрывать этот applyChanges
метод.
Есть ли способ сделать это? Или даже другой шаблон, который я мог бы реализовать. Например, я думал, что сначала смогу сложить вызовы метода, но я все равно не буду знать, когда остановиться и выполнить applyChanges
метод 🙁
Комментарии:
1. Что должно произойти, если кто-то сделает следующее:
const foobar = new Foobar().methodA(); foobar.methodB();
я думаю, вы не можете избежать передачи ответственности за звонок вызывающемуapplyChanges
абоненту, иначе, я думаю, вам следует позвонитьapplyChanges
methodA
иmethodB
.
Ответ №1:
Если applyChanges
бы операция была async
(и я предполагаю, что для «сохранения» в любом случае может потребоваться что-то асинхронное), это было бы просто: у вас мог бы then
быть такой метод:
async applyChanges () { /*...*/ } then (success, failure) { return this.applyChanges().then(success, failure) }
Затем await
ваш объект будет неявно применять изменения и ждать, пока они будут выполнены ( await new Foobar().methodA().methodB()
), потому async
что / await
использует обещания под капотом, поэтому await x
вызовет x.then
вызов, если он существует. Например, так ведут себя объекты запроса Мангуста.
Комментарии:
1. Я думаю, что «упорство» здесь вводило в заблуждение. К сожалению, на самом деле у меня нет ничего асинхронного. На самом деле я пытаюсь создать небольшой класс для создания HTTP-насмешек, и API, который я имел в виду, был примерно таким:
mockRequest(url).withStatus(400).withPayload(somePayload).withHeaders(headersSet)
Но я использую Polly.js как базовая библиотека для HTTP издевается, поэтому я хотел «зарегистрировать» обработчик только после того, как эта строка будет написана
Ответ №2:
Ладно, так что мне действительно все сошло с рук благодаря Полли. Поскольку он лениво оценивает http-обработчик, который я создаю, он получает его «правильную версию» при выполнении HTTP-запросов 🙂