Запуск метода then после выполнения запроса XMLHttpRequest

#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 внутри функции