Ваш обработчик onreadystatechange
неверен.Вам нужно проверить readyState
для значения 4 (а не просто для истинного значения), и вы не хотите отклонять, пока readyState
не станет 4:
if(xhr.readyState === 4){
if (xhr.status == 200) { // or xhr.status >= 200 && xhr.status < 300
resolve(xhr.responseText);
} else {
reject("false")
}
}
Но с современными браузерами вы 'Возможно, вместо этого используйте fetch
, что уже дает обещание.Только не делайте этих распространенных ошибок (это пост в моем анемичном небольшом блоге).
Что касается того, почему вы видели то, что видели, так как вы позвонили open
иsend
до прикрепления обработчика, очевидно, вы не получили обратный вызов для readyState
1 (открытый), поэтому похоже, что первый полученный вами обратный вызов был, когда были получены заголовки (readyState
2), и в этот момент xhr.status
будет установлено - значит, вы выполняете свое обещание, но, конечно, тело запроса еще не получено.