При создании расширения Firefox у меня есть диалог, который вызывает функцию Javascript, когда пользователь нажимает кнопку «ОК». Эта функция выглядит следующим образом:Javascript XMLHttpRequest Puzzler: асинхронный или синхронный
var acceptSubscribeHttpReq = null;
function acceptSubscribe(url) {
acceptSubscribeHttpReq = new XMLHttpRequest();
acceptSubscribeHttpReq.onload = httpLoadedSubscribe;
acceptSubscribeHttpReq.onerror = httpErrorSubscribe;
try {
acceptSubscribeHttpReq.open("GET", url, true);
acceptSubscribeHttpReq.send(null);
} catch(e) {
acceptSubscribeHttpReq.abort();
return false;
}
// alert("request.status = "+acceptSubscribeHttpReq.status);
return true;
}
Интересно, что это работает хорошо, если я использую синхронный посыл (установив третий аргумент открытой лжи), или если я раскомментировать предупреждение в конце функции. Но если я использую асинхронный, не раскомментируя предупреждение, то это терпит неудачу - я возвращаюсь от этой функции, как ожидалось, но обработчик onload никогда не срабатывает.
Это указывает на то, что объект XMLHttpRequest уничтожается, когда функция завершается. Это верно? Это происходит, потому что это называется с помощью кнопки? И если да, то каковы возможные решения? Если это не так, любая идея, почему это будет происходить?
Вот в XUL для диалога:
<dialog id="winMain" title="&settingWindow.title;" style="min-width:400px;"
onload="initSubscribe();" ondialogaccept="return acceptSubscribe();"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
Любые и все оцененная помощь!
Как это происходит без вызова обработчика 'httpErrorSubscribe'? – Bergi
@ Берги - Я хотел бы знать это сам! Но да, если я выполняю асинхронную отправку, обработчики onload или onerror не выполняются. –