Прокси-серверы ES6 - возможно ли захватывать методы, вызываемые для нулевого объекта, до того, как они произойдут?

1

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

Например, схема имеет класс User с атрибутом, называемым email. Если произошла ошибка, User.validators.getEmailErrors() возвращает Array всех ошибок, например ['Email address cannot be blank', 'Email addresses must match'].

Однако, если поле действительно и ошибки не найдены, getEmailErrors() возвращает значение null.

В моем приложении я хочу безопасно getEmailErrors().join(',') несколько методов из getEmailErrors(), например getEmailErrors().join(','), но без предварительной проверки null. Скорее, существует ли способ, например, с использованием прокси ES6, чтобы getEmailAddress() знал, вернет ли он Array и безопасно будет игнорировать любые методы, такие как join() если он вернет null?

Легким решением было бы вернуть пустой Array в действительном случае вместо null, но предположим, что я не могу его изменить.

  • 1
    Почему бы не (getEmailErrors() || []).join(',') ?
Теги:
ecmascript-6
proxy-pattern

2 ответа

0
Лучший ответ

Это можно сделать косвенно.

Следующий код был создан из ЗДЕСЬ, и я добавляю код для тестирования.

Спасибо за оригинального автора, Djamel Hassaine.

{
    class test {
		constructor () {
			this.in = 0;
        }
        sum ( a, b ) {
            this.in += a + b;
			return this;
        }
    }
    let k = new test();

    function traceMethodCalls(obj) {
        const handler = {
            get(target, propKey, receiver) {
                console.log( target, propKey, receiver );
				console.log( this );
				console.log( handler === this );
				const targetValue = Reflect.get(target, propKey, receiver);
                if (typeof targetValue === 'function') {
                    return function (...args) {
                        console.log('CALL', propKey, args);
						console.log( this );
						console.log( this === receiver );
                        return targetValue.apply(this, args); // (A)
                    }
                } else {
                    return targetValue;
                }
            }
        };
        return new Proxy(obj, handler);    
    }

	let l = traceMethodCalls( k );
	console.log( l.sum( 1, 2 ) );
	console.log( l );
	console.log( l.sum( 1, 2 ) );
	console.log( l );
}

По-другому:

User.validators.getEmailErrorsOriginal = User.validators.getEmailErrors
User.validators.getEmailErrors = function ( ...args ) {
  return ( this.getEmailErrorsOriginal( ...args ) || [] );
}
0
(getEmailErrors() || []).join(',')

Это то, что вы ищете? Это не очень чистое, но, конечно, короткое...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню