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

Я все еще не понимаю разницу между вызовом решения resolver() vs execute()? Я вижу как функции, так и термины "разрешить обещание" и "выполнить обещание", отброшенные вокруг.

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

выполнить означает "разрешить" успешно. Это вызовет успешные обратные вызовы в действиях then. Друг "выполнить" для отказа - отклонить.

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

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

Q

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

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

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