2014-09-25 3 views
8

В чем разница между использованием команд Nodejs Q .finally() и .done().В чем разница между библиотекой Q Promise .finally() и .done()?

Например, в чем разница между этими двумя?

Q(...) 
.then(...) 
.finally(); //or fin() 

Q(..) 
.then() 
.done(); 
+0

Какие аргументы вы передаете '.then',' .finally' и '.done'? – Bergi

+0

Я прочитал документы и не нашел ответа настолько очевидным. –

+0

обещание теперь входит в спецификацию JS, часть стандарта ECMAScript 2015 (ES6). – Pieter

ответ

17

promise.done(onSuccess, onError) просто позволяет обрабатывать разрешенные значения. Дополнительным преимуществом является то, что это не подразумевает проглатывания ошибок (как в случае с promise.then()), это гарантирует, что любое вовлеченное исключение будет раскрыто. Он также эффективно заканчивает цепочку и не возвращает никаких дальнейших обещаний.

promise.finally(fn) предназначен для регистрации задачи, которая должна быть выполнена после разрешения данного обещания (неважно, будет ли обещание успешным или неудачным). Обычно вы используете его для каких-либо операций очистки, например. представьте, что вы настроили индикатор выполнения, который должен быть скрыт после завершения запроса (независимо от того, был ли он успешным), а затем просто выполните promise.finally(hideProgressBar). Дополнительно promise.finally() возвращает обещание ввода, поэтому вы можете вернуть его для дальнейшей обработки.

+0

Благодарим за разъяснения! –

+0

И какая разница между методом .catch и .fail? – jaumard

+0

'.catch (cb)' - это псевдоним для '.then (null, cb)'. Хотя '.fail' никогда не устанавливался в библиотеках Promise A +. Я думаю, что у него было это до того, как был придуман 'catch', и он сделал именно то, что делает« catch ». В jQuery 'fail' берет только вызов callbacks' done' (без проглатывания ошибки). В моей реализации я считаю, что добавить '.fail (cb)' в качестве псевдонима для '.done (null, cb)' -> https://github.com/medikoo/deferred/issues/35 –

8

Разница в цепочки и обработки ошибок и регистрации ошибок:

Q(...) 
.then(...) 
.finally(); 

Здесь, если then броска, finally все равно будет работать, но никакой ошибки не зарегистрирует. В Q finally выполняется независимо от .then успешной или нет. Это похоже на ключевое слово finally в JS try/catch/finally. В этом случае также можно связать дополнительные цепи then.

Q(..) 
.then() 
.done(); 

Здесь done указывает на то, что обещание цепи закончилась, вы не можете цепи к ней больше. Если вы передадите его только обработчику onFulfilled, он не будет запущен, если будет сброшен then, и он будет регистрировать ошибки, если он заканчивается исключением.

Смежные вопросы