zkrvndm
@zkrvndm
Архитектор решений

Как определить номер строки вызвавший Deferred.reject?

У библиотеки jQuery есть свой аналог промисов:
https://basicweb.ru/jquery/jquery_deferred.php
Штука крайне интересная.

Хочу изменить поведение метода .reject, чтобы при вызове метода вместе с аргументами еще и передавался номер строки на которой этот метод вызван. С получением номера строки из который вызван метод .reject проблем нет:
try {
	throw Error();
} catch(err) {
	var err_text = err.stack;
}
var arr = err_text.split(':');
var string_number = arr[arr.length - 2]; // Номер строки из которой вызвана текущая функция

Но я не могу никак найти в коде jQuery тело метода .reject, чтобы его подправить!
Кто хорошо понимает jQuery, подскажите, как проще всего изменить метод .reject у объектов Deferred?
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Сергей Сергей, спасибо за решение.

Сделал обёртку для $.Deferred() - это работает. Ниже пример, если кому надо:

Развернуть пример
$(function() {
	
	// Логирование всех reject-событий:
	
	var original_deferred = $.Deferred;
	$.Deferred = function() {
		var deferred = original_deferred.apply(this, arguments);
		var original_reject = deferred.reject;
		deferred.reject = function() {
			try { throw Error(); } catch(err) {
				var mod_args = $(arguments).toArray();
				var str_num = err.stack.split(':').reverse()[1];
				mod_args.unshift(str_num + ' строка:');
				console.error.apply(this, mod_args);
				original_reject.apply(this, arguments);
			}
		}
		return deferred;
	}
	
	init(); // Проверка
	
});

function init() {
	
	var deferred = $.Deferred();
	
	setTimeout(function() {
		deferred.reject('Тестовая ошибка!');
	}, 1000);
	
	return deferred;
	
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы