Я работаю над обновлением библиотеки, которая выглядит примерно так (для краткости в coffeescript):
//machine.coffee
exports.Machine = class Machine
constructor: (config) ->
/** initialize Machine with config data **/
getSomething: (callback) ->
/** do something that depends on config **/
callback null, something
и используется так, как вы могли ожидать:
machine = require 'machine'
config = {knob: "tweak", switch: "fiddle" }
myMachine = machine.createMachine config
myMachine.getSomething (err, something) ->
/** we now have something **/
Однако теперь конфигурация зависит от параметра, который я должен запросить с другого сайта, поэтому он выглядит примерно так, и машина была обновлена для анализа и использования данных из внешних источников. Так что доступ к Машине, как это работает:
config = {knob: "tweak", switch: 'http://returns/switch/data' }
/**methods now must wait until Machine is initialized with remote config data **/
machine.createMachine config, (err, machine) ->
machine.getSomething (err, something) ->
/** we now have something **/
Но проблема в том, что это нарушает первоначальное использование, которое было:
myMachine = machine.createMachine config
/** remote calls to config not completed yet **/
myMachine.getSomething (err, something) ->
/** we don't have something because Machine is still initializing **/
Мой вопрос: есть ли способ сохранить исходный вариант использования?
Один из подходов может заключаться в том, чтобы ставить вызовы методов неинициализированного класса в очередь до его полной инициализации, но я не уверен, как вообще начать это делать. Есть ли способ поставить в очередь методы? Или есть другие лучшие подходы, которые позволили бы работать устаревшему коду с оригинальным использованием?
Разъяснение :
У меня нет контроля над исходными данными config
и над тем, когда и какие методы будут впоследствии вызываться на компьютере. У меня есть возможность модифицировать Машину любым необходимым способом.