Chrome と Firefox で動作する JavaScript クライアントを使用していますが、IE では失敗します。IE デバッガーでネットワーク トレースを見ると、複数の AJAX 呼び出しが中止されていることがわかります。
タイムアウトを 0 に設定することで回避できました。これが、中止されたリクエストを処理する正しい方法であるかどうかを知りたいですか? 基本的に何がうまくいかないのでしょうか?
私の最初の考えは、エラーをキャプチャして再送信する必要があり、複数の再送信で要求が完了しない場合は、最終的にユーザーに警告することでした。setTimeout が当面の問題に対処する適切な方法であっても、これを行う方法を知りたいです。
また、アプリケーションはアドレスの Excel ワークブックを処理し、Web サービスを呼び出してデータを追加し、ユーザーが拡張ファイルをダウンロードできるようにします。
これは私がこれまでに持っているもので、最初は app.js にあります
var requestWithFeedback = function (args) {
$(".loader").removeClass('hidden');
var oldConfig = args.config || function () { };
args.config = function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + localStorage.token);
oldConfig(xhr);
extract: extract;
};
var deferred = m.deferred();
setTimeout(function () { // <== This solved in IE, but is this the way to handle this?
m.request(args).then(deferred.resolve, function(err){
if (err === "Invalid token!"){
m.route('/');
}
})}, 0);
$(".loader").addClass('hidden');
return deferred.promise;
}
model.js から
app.MarkedAddresses.ProcessAddressBatch = function () {
var requestData = {
Addresses: app.MarkedAddresses.vm.addresses
}
return requestWithFeedback({
method: "POST"
, url: "API/server.ashx"
, data: requestData
, deserialize: function (value) { return value; }
})
.then(function (value) {
var responseJSON = $.parseJSON(value);
$.merge(app.MarkedAddresses.vm.results, responseJSON)
app.MarkedAddresses.vm.currentRecord(app.MarkedAddresses.vm.results.length);
app.MarkedAddresses.vm.progress(Math.max(app.MarkedAddresses.vm.progress(), ~~(app.MarkedAddresses.vm.currentRecord() / app.MarkedAddresses.vm.totalRecords() * 100)));
m.redraw(); //Force redraw for progress bar
return value;
},
function (error) { console.log(error) } // <== I thought error would show up here, but I never hit a breakpoint here.
);
}
追加されたループ
function process_wb(wb) {
app.MarkedAddresses.vm.results.length = 0;
$('.descending').removeClass("descending");
$('.ascending').removeClass("ascending");
app.MarkedAddresses.vm.progress(.1);
m.redraw();
var header = mapHeader(wb);
var addressJSON = to_json(wb, header);
app.MarkedAddresses.vm.totalRecords(addressJSON.length);
for (var i = 0; (i < addressJSON.length + 1) ; i += 1000) {
app.MarkedAddresses.vm.addresses = addressJSON.slice(i, Math.min(((i) + 1000), addressJSON.length));
app.MarkedAddresses.vm.response(new app.MarkedAddresses.vm.processAddressBatch());
}
}
コードのセクションでエラーが発生しないのはなぜですか? ここに遅延セクションを追加する必要があるようですが、私が試したものはすべて構文エラーでした。