q.js: разница между разрешением() и выполнением()

Мне до сих пор неясна разница между вызовом метода разрешения() и выполнения()? Я вижу, что и функции, и термины «разрешить обещание» и «выполнить обещание» часто меняются.

Когда я должен использовать каждый?


person alecf    schedule 16.08.2013    source источник
comment
Я не вижу метода fulfill в документации q. github.com/kriskowal/q/wiki/API-Reference   -  person Barmar    schedule 16.08.2013
comment
см. также Какова правильная терминология для обещаний javascript   -  person Bergi    schedule 10.05.2016
comment
каждый мужчина и его собака продолжают использовать решенные и выполненные взаимозаменяемо. На мой взгляд, решенный означает, что больше не ожидается. например обещание было выполнено с успехом... или обещание было выполнено с ошибкой; или обещание было решено другим обещанием...   -  person joedotnot    schedule 04.11.2018


Ответы (2)


Вы должны использовать resolve. deferredPromise.resolve(nextPromise) означает, что все, что ожидает deferredPromise, теперь будет ждать nextPromise. Если nextPromise вообще не обещание, оно превращается в выполненное обещание, которое продолжает информировать все, что его ожидает, о том, что значение стало доступным.

Метод fulfill — плохая идея, которая будет признана устаревшей и в конечном итоге полностью исчезнет. fulfill семантически эквивалентен resolve во всех полезных случаях. Единственная причина существования заключается в том, что deferredPromise.fulfill(value) людям легче интерпретировать, чем deferredPromise.resolve(value), поскольку resolve перегружен для обработки как nextPromise, так и finalValue.

Проблема с fulfill вообще в том, что deferredPromise.fulfill(rejectedPromise) семантически парадоксально.

person Kris Kowal    schedule 27.08.2013
comment
…если только мы не разрешим вложенные промисы — семантически чистые :-) - person Bergi; 28.08.2013
comment
@Bergi, об этом много говорилось, но resolve не нужно менять. Ходят разговоры о переносе принуждения в then (и другие) и использовании flatMap для развертывания строго монадических промисов. - person Kris Kowal; 10.10.2013

В целом, разрешить означает либо добиться успеха, либо потерпеть неудачу. Это то, что вызывает вызов действий then. Это может произойти ровно один раз для любого обещания.

выполнить означает «решить» успешно. Это вызовет успешные обратные вызовы в действиях then. Аналог «выполнить» для отказа — отклонить.

С другой точки зрения, вы можете классифицировать статус любого обещания в определенный момент времени как «нерешенный» (иногда также называемый ожидающим) или «решенный», а «решенный» имеет подстатусы «исполнено» и «отклонено». Обещание в статусе «выполнено» имеет значение, а обещание в статусе «отклонено» имеет причину.

Конкретные методы в каждом API, используемые для представления этих понятий, различаются. И, к сожалению, есть много сообщений в блогах и документов, которые путают эти термины, в частности, используя «заполнить», когда они означают «разрешить», или наоборот.

Q

Я не очень хорошо знаю Q, но похоже, что его метод resolve на самом деле выполняет обещание (выделение добавлено):

Вызов разрешения со значением, отличным от обещания, приводит к тому, что обещание выполняется с этим значением.

Изюминка, однако, в том, что вы также можете вызвать deferred.resolve с промисом, и в этом случае первый промис более или менее принимает состояние переданного промиса. Например, если переданное обещание находится в состоянии «ожидание», обещание принимает состояние ожидания переданного обещания. Это подразумевает немного странную семантику, что метод с именем resolve на самом деле не разрешает промис.

person Community    schedule 18.08.2013
comment
Мне нравится твое объяснение. Вы правы, это действительно сбивает с толку, что разные реализации API выбирают разные значения для resolve и fulfill. - person demisx; 11.03.2015