Слишком часто я вижу примеры Ajax, где ответ обрабатывается следующим образом: (псевдокод, используемый для демонстрационных целей)
xhr.onreadystatechange = function()
{
if ( xhr.readyState == 4 )
{
if (xhr.status == 200)
{
// Process returned data (eg: Parse XML).
// Check status of result depending on custom/ad-hoc error detection.
// -- most commonly a 0 for fail, or 1 for pass
// Deal with/report error, or take some other action based upon returned data.
}
}
}
Вышеупомянутый подход работает, но по мере роста вашего приложения и увеличения потребности в предоставлении полезных отчетов об ошибках (и предотвращении ошибок!) Хорошая проверка ошибок в логическом стиле быстро станет громоздкой. Я вижу это сейчас…
- Разработчик 1 :
Что означает код ошибки 7 снова?
- Разработчик 2 :
Хм, подожди, я уверен, что мы где-то записали это …
Не бойтесь, есть гораздо более умная альтернатива, на которую вы полагаетесь каждый раз, когда загружаете свой браузер — коды состояния HTTP (посмотрите на юмористический сокращенный список Марка Пилигрима, если мысль о прочтении еще одного RFC вводит вас в тупик с остекленевшими глазами) ,
Взяв предыдущий пример, я добавил блок switch
xhr.onreadystatechange = function()
{
if ( xhr.readyState == 4 )
{
switch ( xhr.status )
{
case 200: // OK!
/*
* If the request was to create a new resource
* (such as post an item to the database)
* You could instead return a status code of '201 Created'
*/
break;
case 304: // Not Modified
/*
* This would be used when your Ajax widget is
* checking for updated content,
* such as the Twitter interface.
*/
break;
case 400: // Bad Request
/*
* A bit like a safety net for requests by your JS interface
* that aren't supported on the server.
* "Your browser made a request that the server cannot understand"
*/
break;
case 409: // Conflict
/*
* Perhaps your JavaScript request attempted to
* update a Database record
* but failed due to a conflict
* (eg: a field that must be unique)
*/
break;
case 503: // Service Unavailable
/*
* A resource that this request relies upon
* is currently unavailable
* (eg: a file is locked by another process)
*/
break;
}
}
}
Поэтому в следующий раз, когда вы собираетесь вставить <status>1</status>
Это может быть первым шагом к получению некоторого ОТДЫХА , который, безусловно, является хорошей вещью ™.