#javascript #c# #xmlhttprequest
Вопрос:
У меня есть метод, действующий как асинхронный метод. После отправки запроса функции, которая была вызвана этим запросом, я хочу запустить что-то вроде метода then, но тогда для XMLHttpRequest не существует метода then. вызывающая функция в приведенном ниже коде не имеет метода then
let result = dataService.exportfile('get', '/api/overtimeedari/exporttoexcle/', model).
then(() => {
self.loading(false);//غیرفعال کردن حالت لود شدن گرید
buttonListSearch.Excel.loading(false); //غیرفعال کردن حالت لود شدن دکمه اکسل
});
вызываемая функция
function exportfile(mehtodtype, url, model) {
debugger;
var qs = "?";
model.map((item) => {
qs = `${qs}${item.name}=${item.value}amp;`;
});
var request = new XMLHttpRequest();
request.open(mehtodtype, url qs, true);
request.setRequestHeader('Authorization', "Bearer " window.localStorage.getItem('token'));
request.responseType = 'blob';
request.onload = function (e) {
if (this.status === 200) {
var blob = this.response;
if (window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveBlob(blob, fileName);
}
else {
var downloadLink = window.document.createElement('a');
var contentTypeHeader = request.getResponseHeader("Content-Type");
downloadLink.href = window.URL.createObjectURL(new Blob([blob], { type: contentTypeHeader }));
downloadLink.download = "Export.xls";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
}
};
request.send();
return request;
}
Комментарии:
1. XHMHttpRequest не имеет никакого
.then
свойства — вы думаете оfetch
том, возможно? или что-то еще, что возвращает Обещание? обещание — это то, что имеет.then
метод-вы, конечно, можете завернуть код внутриfunction exportfile
в обещание, если вам определенно необходимо использоватьXMLHttpRequest
2. @Bravo Мне нужно что-то вроде функции обратного вызова, запущенной после завершения XMLHttpRequest.
3. конечно, тогда сделайте это — предоставьте функцию обратного
exportfile
вызова и вызовите ее при необходимости — это тоже работает4. @Браво, дело в том, что у меня нет возможности изменить функцию «экспорт файла», потому что она влияет на другие функции
Ответ №1:
Учитывая ограничение не изменять exportfile
функцию в соответствии с комментарием
дело в том, что у меня нет возможности изменить
exportfile
функцию, потому что она оказывает побочное влияние на другие функции
лучший способ справиться с этим заключается в следующем
let req = dataService.exportfile('get', '/api/overtimeedari/exporttoexcle/', model);
req.addEventListener('loadend', () => {
// do what's needed here
});
поскольку exportfile
возвращает объект XMLHttpRequest, вы можете прослушивать loadend
событие и делать все, что вы там делаете
Обратите внимание, loadend
что событие запускается независимо от успеха или неудачи
Вы могли бы сделать то же самое с load
событием, если хотите, но я не уверен, в каком порядке
x.onload=() => {};
x.addEventListener('load', () => {});
уволены … также обратите внимание, НЕ
req.onload=() => {};
так как это перезаписало бы обратный вызов onload внутри функции