Мне до сих пор неясна разница между вызовом метода разрешения() и выполнения()? Я вижу, что и функции, и термины «разрешить обещание» и «выполнить обещание» часто меняются.
Когда я должен использовать каждый?
Мне до сих пор неясна разница между вызовом метода разрешения() и выполнения()? Я вижу, что и функции, и термины «разрешить обещание» и «выполнить обещание» часто меняются.
Когда я должен использовать каждый?
Вы должны использовать resolve
. deferredPromise.resolve(nextPromise)
означает, что все, что ожидает deferredPromise
, теперь будет ждать nextPromise
. Если nextPromise
вообще не обещание, оно превращается в выполненное обещание, которое продолжает информировать все, что его ожидает, о том, что значение стало доступным.
Метод fulfill
— плохая идея, которая будет признана устаревшей и в конечном итоге полностью исчезнет. fulfill
семантически эквивалентен resolve
во всех полезных случаях. Единственная причина существования заключается в том, что deferredPromise.fulfill(value)
людям легче интерпретировать, чем deferredPromise.resolve(value)
, поскольку resolve
перегружен для обработки как nextPromise
, так и finalValue
.
Проблема с fulfill
вообще в том, что deferredPromise.fulfill(rejectedPromise)
семантически парадоксально.
resolve
не нужно менять. Ходят разговоры о переносе принуждения в then
(и другие) и использовании flatMap
для развертывания строго монадических промисов.
- person Kris Kowal; 10.10.2013
В целом, разрешить означает либо добиться успеха, либо потерпеть неудачу. Это то, что вызывает вызов действий then
. Это может произойти ровно один раз для любого обещания.
выполнить означает «решить» успешно. Это вызовет успешные обратные вызовы в действиях then
. Аналог «выполнить» для отказа — отклонить.
С другой точки зрения, вы можете классифицировать статус любого обещания в определенный момент времени как «нерешенный» (иногда также называемый ожидающим) или «решенный», а «решенный» имеет подстатусы «исполнено» и «отклонено». Обещание в статусе «выполнено» имеет значение, а обещание в статусе «отклонено» имеет причину.
Конкретные методы в каждом API, используемые для представления этих понятий, различаются. И, к сожалению, есть много сообщений в блогах и документов, которые путают эти термины, в частности, используя «заполнить», когда они означают «разрешить», или наоборот.
Я не очень хорошо знаю Q, но похоже, что его метод resolve
на самом деле выполняет обещание (выделение добавлено):
Вызов разрешения со значением, отличным от обещания, приводит к тому, что обещание выполняется с этим значением.
Изюминка, однако, в том, что вы также можете вызвать deferred.resolve
с промисом, и в этом случае первый промис более или менее принимает состояние переданного промиса. Например, если переданное обещание находится в состоянии «ожидание», обещание принимает состояние ожидания переданного обещания. Это подразумевает немного странную семантику, что метод с именем resolve
на самом деле не разрешает промис.
resolve
и fulfill
.
- person demisx; 11.03.2015
fulfill
в документацииq
. github.com/kriskowal/q/wiki/API-Reference - person Barmar   schedule 16.08.2013