2013-08-16 6 views
15

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

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

+0

Я не вижу метод 'execute' в документации' q'. https://github.com/kriskowal/q/wiki/API-Reference – Barmar

+0

см. также [Какая правильная терминология для javascript-обещаний] (http://stackoverflow.com/a/29269515/1048572) – Bergi

ответ

17

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

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

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

+0

... если только мы не допустим вложенных обещаний - семантически чистых :-) – Bergi

+0

@Bergi, было много обсуждений этого, но «разрешение» не нужно менять. Говорят о принудительном принуждении к «тогда» (и другим), а использование «flatMap» для разворачивания строго монадических обещаний. –

15

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

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

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

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

Q

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

Calling решительность со значением причины, не обещают обещают быть выполнено с этим значением.

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

+0

Мне нравится ваше объяснение , Вы правы, это действительно запутывает, что различные реализации API выбирают различный смысл для 'разрешения' и' выполнения'. – demisx