resolve()
можно вызывать с любым типом Javascript. Все, что он делает, это передает это значение тому, кто слушает обещание хоста с .then()
или await
.
Единственное исключение - если вы разрешите его с помощью "thenable" (всего, что ведет себя как объект обещания), тогда это само обещание будет ожидаться, и разрешенное значение исходного обещания станет разрешенным значением этого нового обещания.
Фактически, нет никакого способа непосредственно разрешить само обещание, потому что resolve()
обнаружит, что вы решили выполнить обещание, и применит к нему цепочку. Если у вас когда-либо была причина для этого, вам бы пришлось заключить обещание в объект и разрешить его с помощью объекта.
Ничто не мешает вам передать любое значение Javascript в reject()
, но Это часто практикуемое соглашение об отклонении с объектами Error, и существует довольно много кода обработки ошибок, который может быть проще или проще или даже может ожидать, что вы будете использовать объекты Error. Он также имеет то преимущество, что предлагает вам трассировку стека (хотя иногда и меньшую асинхронную трассировку стека), которая, по крайней мере, сообщит вызывающей стороне, где возникла ошибка, если им потребуется дополнительная информация о том, что могло произойти. Но в стандарте или в языке, реализованном на языке, нет ничего, что требовало бы от вас reject()
с объектом ошибки.
Вы также можете заметить, что ваш пример вызывает resolve("string")
, а затем вызывает reject("error")
. Обещание - одноразовое устройство. Первый resolve()
или reject()
, который вызывается, является единственным, на который обращают внимание - любые последующие вызовы любого из них просто игнорируются. Обещание «фиксирует» первое разрешенное значение или отклоняет причины, по которым вы его указали, и после этого не может быть изменено.