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
фактически не разрешает обещание.