А зачем мы тут вообще разделяем на done и fail? Можно же обрабатывать это всё одним коллбеком через always