Как лучше всего совместить код между обоими методами

Интересно, как лучше всего совместить код между этими двумя методами в javascript:

async getAllActiveRooms(ctx: ?ContextType): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true);
}
async getActiveRoomsBySessionId(ctx: ?ContextType, sessionId: number): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true)
        .andWhere('sessionId',sessionId)
}

Спасибо

Повторно используйте getAllActiveRooms в getActiveRoomsBySessionId .

str 11.04.2018 12:07

Что вы имеете в виду под mutualize code between these 2 methods?

Ankur 11.04.2018 12:08
0
2
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете повторно использовать getAllActiveRooms, изменив его возвращаемый тип на QueryBuilder от knex, который расширяет интерфейс обещаний Bluebird. Вы потеряете тип полезной нагрузки обещания RoomType[], поскольку он расширяет Bluebird<any>

Из последнего определения типа knex (QueryBuilder расширяет ChainableInterface):

interface QueryBuilder extends QueryInterface, ChainableInterface {
        or: QueryBuilder;
        and: QueryBuilder;

        //TODO: Promise?
        columnInfo(column?: string): Bluebird<ColumnInfo>;

        forUpdate(): QueryBuilder;
        forShare(): QueryBuilder;

        toSQL(): Sql;

        on(event: string, callback: Function): QueryBuilder;
}

interface ChainableInterface extends Bluebird<any> {
        toQuery(): string;
        options(options: any): QueryBuilder;
        stream(callback: (readable: stream.PassThrough) => any): Bluebird<any>;
        stream(options?: { [key: string]: any }): stream.PassThrough;
        stream(options: { [key: string]: any }, callback: (readable: stream.PassThrough) => any): Bluebird<any>;
        pipe(writable: any): stream.PassThrough;
        exec(callback: Function): QueryBuilder;
}

async getAllActiveRooms(ctx: ?ContextType): QueryBuilder {
    //log getAllActiveRooms
    return this.i.knex('users_rooms')
        .transacting(ctx ? ctx.transaction : null)
        .leftJoin('rooms', 'users_rooms.roomId', 'rooms.id')
        .select('rooms.*')
        .where('active', true);
}
async getActiveRoomsBySessionId(ctx: ?ContextType, sessionId: number): Promise<RoomType[]> {
    //log getAllActiveRooms
    return this.getAllActiveRooms(ctx)
        .andWhere('sessionId',sessionId)
}

Спасибо, выглядит так волшебно, что та же функция может возвращать Promise <RoomType [] или QueryBuilder.

fstn 11.04.2018 15:34

Другие вопросы по теме