Javascript: (неявно) вызывайте конечный метод после цепочек методов

#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-запросов 🙂