Для всего этого уже давно есть promise. В resolve храните нормальные ответы, в reject отправляйте как ошибки по статусу, так и ошибки приходимые с бэкенд (например свойством error). Затем вызываете у промиса then (падает resolve) и catch (падает reject)