2013-04-11 4 views
0

При создании расширения 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#"> 

Любые и все оцененная помощь!

+0

Как это происходит без вызова обработчика 'httpErrorSubscribe'? – Bergi

+0

@ Берги - Я хотел бы знать это сам! Но да, если я выполняю асинхронную отправку, обработчики onload или onerror не выполняются. –

ответ

0

Поле статус из запроса существует только после того, как запрос закончил (OnLoad/OnError). Если вы попытаетесь получить доступ к этому полю до того, как запрос будет завершен, у вас будет ошибка, потому что такого поля не существует.

+0

Я не думаю, что это правда. request.status равен нулю сразу после отправки. –

+0

Если да, то в чем именно ошибка, которую вы испытываете? Попробуйте добавить код 'console.log (...)' для получения дополнительной информации. – jap1968

Смежные вопросы