Как читать в данных

Да, это плохая практика. Конструктор должен возвращать экземпляр своего класса, ничего другого. Это испортило бы new operator и наследование в противном случае.

Кроме того, конструктор должен создавать и инициализировать новый экземпляр. Он должен настраивать структуры данных и все специфичные для экземпляра свойства, но не выполнять какие-либо задачи. Это должна быть чистая функция без побочных эффектов, если это возможно, со всеми преимуществами, которые имеют.

Что делать, если я хочу выполнять вещи из моего конструктора?

blockquote>

Это должно идти в методе вашего класса. Вы хотите изменить глобальное состояние? Затем вызовите эту процедуру явно, а не как побочный эффект создания объекта. Этот вызов может идти сразу после создания экземпляра:

var engine = new Engine()
engine.displayPosts();

Если эта задача асинхронна, теперь вы можете легко вернуть обещание своих результатов из метода, чтобы легко дождаться завершения. Однако я бы не рекомендовал этот шаблон, когда метод (асинхронно) мутирует экземпляр и другие методы, зависит от этого, поскольку это приведет к тому, что им потребуется ждать (стать асинхронным, даже если они фактически синхронны), и вы быстро некоторое внутреннее управление очередями продолжается.

Что делать, если я хочу асинхронно загружать данные в свой экземпляр?

blockquote>

Задайте себе вопрос: Вам действительно нужен экземпляр без данных? Не могли бы вы использовать его каким-то образом?

Если ответ на это No , то вы не должны создавать его, прежде чем у вас есть данные. Создайте данные, если это параметр для вашего конструктора, вместо того, чтобы сообщать конструктору, как извлекать данные (или передавать обещание для данных).

Затем используйте статический метод для загрузки данных, из которых вы возвращаете обещание. Затем соедините вызов, который обертывает данные в новом экземпляре:

Engine.load({path: '/path/to/posts'}).then(function(posts) {
    new Engine(posts).displayPosts();
});

Это позволяет значительно повысить гибкость в способах получения данных и значительно упростить конструктор. Аналогично, вы можете писать статические заводские функции, которые возвращают обещания для экземпляров Engine:

Engine.fromPosts = function(options) {
    return ajax(options.path).then(Engine.parsePosts).then(function(posts) {
        return new Engine(posts, options);
    });
};

…

Engine.fromPosts({path: '/path/to/posts'}).then(function(engine) {
    engine.registerWith(framework).then(function(framePage) {
        engine.showPostsOn(framePage);
    });
});

0
задан stark 25 February 2015 в 15:14
поделиться