Обещание гарантии обратного вызова разрешено или отклонено в конструкторе класса ES6? - PullRequest
0 голосов
/ 10 июля 2019

Мне сложно понять, почему используется обратный вызов, который всегда возвращает пустой объект.И передать параметр в этот обратный вызов.

https://github.com/ghdna/cognito-express/blob/master/lib/strategy.js#L20

Я принимаю эту гарантию, что Обещание либо разрешено, либо отклонено.

class CognitoExpress {
    constructor(config) {
        if (!config)
            throw new TypeError(
                "Options not found. Please refer to README for usage example at https://github.com/ghdna/cognito-express"
            );

        if (configurationIsCorrect(config)) {
            this.userPoolId = config.cognitoUserPoolId;
            this.tokenUse = config.tokenUse;
            this.tokenExpiration = config.tokenExpiration || 3600000;
            this.iss = `https://cognito-idp.${config.region}.amazonaws.com/${this
                .userPoolId}`;
            this.promise = this.init(callback => {});
        }
    }

    init(callback) {
        return request(`${this.iss}/.well-known/jwks.json`)
            .then(response => {
                this.pems = {};
                let keys = JSON.parse(response)["keys"];
                for (let i = 0; i < keys.length; i++) {
                    let key_id = keys[i].kid;
                    let modulus = keys[i].n;
                    let exponent = keys[i].e;
                    let key_type = keys[i].kty;
                    let jwk = { kty: key_type, n: modulus, e: exponent };
                    let pem = jwkToPem(jwk);
                    this.pems[key_id] = pem;
                }
                callback(true);
            })
            .catch(err => {
                callback(false);
                throw new TypeError(
                    "Unable to generate certificate due to \n" + err
                );
            });
    }

1 Ответ

2 голосов
/ 10 июля 2019

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

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

Теперь метод init принимает аргумент обратного вызова required : если он не будет передан, при выполнении callback() возникнет исключение. Это слабое место в API, потому что теперь код конструктора (который принадлежит самому API) должен передавать аргумент обратного вызова в свой собственный вызов init. Хотя этот конструктор не нужно «вызывать обратно», он должен предоставить действительный обратный вызов, и поэтому он передает фиктивный:

callback => {}

Несколько комментариев по этому поводу:

  • Это не функция, которая возвращает пустой объект. Это функция, которая выполняет пустой блок операторов.

  • Функция принимает аргумент, который называется callback. Вероятно, автор подумал, что это поможет понять, что этот обратный вызов является ... обратным вызовом, но, честно говоря, меня смущает вызов параметра этой функции callback: , isn ' Обратный вызов - это неиспользуемый параметр обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...