У меня есть рабочий способ перехватить вызов xhr и изменить ответ video.js xhr.Но есть проблема.
Мой обходной путь для изменения ответа video.js xhr
- Я изменяю основной прототип xhr и добавляю свою асинхронную функциюдля прослушивателя событий « readystatechange »
Моя пользовательская асинхронная функция запущена.Эта пользовательская функция выполняет многократные вызовы xhr для обещаний, присоединяет контент и заменяет ответ video.js xhr на мой пользовательский ответ.
(function (proxied) {
XMLHttpRequest = function () {
//cannot use apply directly since we want a 'new' version
var wrapped = new (Function.prototype.bind.apply(proxied, arguments));
// Here we can subscribe to the xhr.send to save the xhr events to local variable, remove the events from xhr
// ---------------- Add custom onreadystatechange event so we will be able to modify the response --------------
wrapped.addEventListener("readystatechange", async function () {
console.log(this.readyState);
// When download completed
if (this.readyState === 4) {
console.log(this.onreadystatechange);
var customContent = await GetCustomContent();
// Update the value of the response object
Object.defineProperty(this, 'response', {
value: customContent,
writable: false
});
// Update the value of the response text
Object.defineProperty(this, 'responseText', {
value: customContent,
writable: false
});
// As we have successfully modify the response now we can add back the events to the xhr and trigger it here.
}
//this.responseText = "Customized response";
}, false);
// -----------------------------------------------------------------------------------------------------------
return wrapped;
};
})(XMLHttpRequest);
Проблема, с которой я сталкиваюсь
Поскольку для вызова video.js xhr функция on включена для события " readystatechange ".Поскольку я также добавил свою собственную функцию, мои функции вызываются первыми.Но из-за того, что во время работы моей функции это характерно, функция события video.js xhr сработала, и поэтому изменение ответа не имеет никакого эффекта.
Так что я думаю, если это возможно, если мы перечислимxhr запрашивает события «readystatechange», сохраняет их в локальных переменных, а затем, когда возвращается мое обещание функции asy, мы добавляем обратно события, которые мы сохранили в локальной переменной, и затем запускаем их.
Таким образом, мы будемвозможность изменить ответ и затем вызвать события video.js.
Но я не знал, как сохранить события в переменной, удалить из xhr и снова добавить обратно в xhr (если это возможно).Подскажите, пожалуйста, как я могу это сделать?
Я имею в виду вышеупомянутый обходной путь, чтобы изменить ответ, если у вас есть какой-то лучший способ, пожалуйста, дайте мне знать.
Спасибо!