Я занимаюсь разработкой приложения, которое должно включать Tencent Captcha. В отличие от Google, он недостаточно хорошо документирован и привел меня в некоторую путаницу, которая заставила меня перепроектировать его запутанный код.
Для бесшовной реализации мне нужно получить обратный вызов, когда он завершит свои вызовы XHR. Эти обратные вызовы не предоставляются капчей. Поэтому мне придется получить их самому.
Для этого я попытался обернуть объект XMLHttpRequest перед загрузкой Angular, но он выдает некоторые ошибки, такие как: TypeError: Cannot set property '__zone_symbol__xhrSync' of undefined
.
Прочитав несколько учебных пособий, глав книг и статей, я понял, что эта упаковка уже сделана в Zone. js. Тем не менее, я до сих пор не уверен, будет ли Zone. js также оборачивать вызовы не-1022 * HXR или нет.
Если да, то как его расширить, чтобы получить обратный вызов после их завершения. Если нет, то как сделать правильную реализацию XHR-перехватчика для не angular XHR-вызовов в Angular приложении?
Вот пример написанного мной HXRInterceptor, который не будет работать без ошибок:
declare global {
interface Window {
XHRInterceptor: any;
}
}
type DataSent =
string | Document | Blob | ArrayBufferView |
ArrayBuffer | FormData | URLSearchParams | ReadableStream<Uint8Array>;
export class XHRInterceptor {
constructor() {
((original: Function): void => {
XMLHttpRequest.prototype.send = (data: DataSent): void => {
console.log('DATA SENT');
original.call(this, data);
};
})(XMLHttpRequest.prototype.send);
(function(original: Function) {
// @ts-ignore
XMLHttpRequest.prototype.open = (
method: string, url: string, async: boolean,
username?: string | null, password?: string | null
): void => {
console.log('DATA OPEN');
original.call(this, method, url, async, username, password);
};
})(XMLHttpRequest.prototype.open);
}
}
Чтобы позвонить, просто введите new XHRInterceptor();
в main.ts.
Спасибо.