Javascript: цепочка асинхронных функций в классе с возвратом этого

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

let sql = require('mssql');
let {logger} = require('../utils/logger');
let config = require('config');
//mssql_stellenanzeigen_config = config.get('stellenanzeigen');
mssql_doublettencheckui_config = config.get('doublettencheckui');


class MSSQLConnectionObject {
    constructor(configuration) {
        this.configuration = configuration; 
        this.connection = undefined;    
        this.requestObject = undefined;  
    }

    async build() {
        let pool;
        try {
            pool = await new sql.ConnectionPool(this.configuration).connect(); 
            console.log("Connection established!: ", pool);
        } catch(e) {
            logger.error("No SQL Database config or wrong config. Can't establish connection to MSSQL Server. " + e);
        }    
        this.requestObject = await new sql.Request(pool);

        return this;
    }

    static async connect(config) {        
        let pool;
        try {
            pool = await new sql.ConnectionPool(config).connect(); 
            console.log("Connection established!: ", pool);
        } catch(e) {
            logger.error("No SQL Database config or wrong config. Can't establish connection to MSSQL Server. " + e);
        }    
        this.requestObject = await new sql.Request(pool);
        return this;
    }

    async getBuchungsquelle() {
        const query = `SELECT * FROM buchungsquelle`;
        return await this.requestObject.query(query).then((result) => console.log(result)).catch(err => console.log(err));
    }
}

module.exports = {
    MSSQLConnectionObject
}

   let query= `select * from buchungsquelle`;  

   let a = new MSSQLConnectionObject(mssql_doublettencheckui_config);
   a.build().getBuchungsquelle();

Я получаю сообщение об ошибке:

a.build().getBuchungsquelle();            

TypeError: a.build(...).getBuchungsquelle is not a function

почему это не работает? Есть ли ошибка в том, как вернуть это из моих функций?


person ChillaBee    schedule 21.05.2019    source источник
comment
Ну, build асинхронный. Вы не можете вызвать getBuchungsquelle по обещанию. Просто используйте цепочку обещаний.   -  person VLAZ    schedule 21.05.2019


Ответы (2)


TypeError: a.build(...).getBuchungsquelle не является функцией

build является функцией async. Когда вы говорите return this, создается функция, которая возвращает обещание, разрешающееся в this, а не функция, которая возвращает this.

Таким образом, чтобы использовать его, вам нужно будет дождаться разрешения промиса и затем последовательно вызвать следующую функцию.

a.build().then( x => x.getBuchungsquelle() )
person Quentin    schedule 21.05.2019
comment
спасибо, это было причиной ... есть ли способ избежать асинхронной функции в методе класса или есть лучший подход, который автоматически разрешает обещание в методе класса javascript? Или я могу просто использовать обычные функции без асинхронности и просто ждать результата? Как бы вы это сделали? - person ChillaBee; 21.05.2019

Это не работает, потому что ваша функция Async.

На самом деле вы возвращаете не экземпляр MSSQLConnectionObject, а экземпляр Promise<MSSQLConnectionObject>.

Асинхронная цепочка:

Проверьте этот пост Stackoverflow, чтобы получить хороший пример асинхронной цепочки!

person MauriceNino    schedule 21.05.2019
comment
спасибо, это было причиной ... есть ли способ избежать асинхронной функции в методе класса или есть лучший подход, который автоматически разрешает обещание в методе класса javascript? Или я могу просто использовать обычные функции без асинхронности и просто ждать результата? Как бы вы это сделали? - person ChillaBee; 21.05.2019
comment
Вы выполняете асинхронные операции (запросы БД). Так что да, было бы разумно сохранить функции асинхронными и передать ответственность за разрешение фактическому вызывающему. Я бы избегал связанных функций с асинхронными операциями. - person MauriceNino; 21.05.2019
comment
Думаю, мне, вероятно, придется поймать Promise внутри собственного метода класса? А затем вернуть или присвоить разрешенное значение Promise экземпляру this.someProperty внутри моего класса и использовать это значение вместе? Что-то вроде этого правильно? - person ChillaBee; 21.05.2019
comment
Я добавил еще один пост Stackoverflow в свой ответ, в котором показано, как реализовать цепочку асинхронных методов. Не стесняйтесь проверить это. - person MauriceNino; 21.05.2019
comment
Я не понимаю ваш вопрос прямо сейчас извините? @user2774480 - person MauriceNino; 21.05.2019