| 6808 | * @returns {Deferred} Returns a new instance of deferred. |
| 6809 | */ |
| 6810 | var defer = function() { |
| 6811 | var pending = [], |
| 6812 | value, deferred; |
| 6813 | |
| 6814 | deferred = { |
| 6815 | |
| 6816 | resolve: function(val) { |
| 6817 | if (pending) { |
| 6818 | var callbacks = pending; |
| 6819 | pending = undefined; |
| 6820 | value = ref(val); |
| 6821 | |
| 6822 | if (callbacks.length) { |
| 6823 | nextTick(function() { |
| 6824 | var callback; |
| 6825 | for (var i = 0, ii = callbacks.length; i < ii; i++) { |
| 6826 | callback = callbacks[i]; |
| 6827 | value.then(callback[0], callback[1]); |
| 6828 | } |
| 6829 | }); |
| 6830 | } |
| 6831 | } |
| 6832 | }, |
| 6833 | |
| 6834 | |
| 6835 | reject: function(reason) { |
| 6836 | deferred.resolve(reject(reason)); |
| 6837 | }, |
| 6838 | |
| 6839 | |
| 6840 | promise: { |
| 6841 | then: function(callback, errback) { |
| 6842 | var result = defer(); |
| 6843 | |
| 6844 | var wrappedCallback = function(value) { |
| 6845 | try { |
| 6846 | result.resolve((callback || defaultCallback)(value)); |
| 6847 | } catch(e) { |
| 6848 | exceptionHandler(e); |
| 6849 | result.reject(e); |
| 6850 | } |
| 6851 | }; |
| 6852 | |
| 6853 | var wrappedErrback = function(reason) { |
| 6854 | try { |
| 6855 | result.resolve((errback || defaultErrback)(reason)); |
| 6856 | } catch(e) { |
| 6857 | exceptionHandler(e); |
| 6858 | result.reject(e); |
| 6859 | } |
| 6860 | }; |
| 6861 | |
| 6862 | if (pending) { |
| 6863 | pending.push([wrappedCallback, wrappedErrback]); |
| 6864 | } else { |
| 6865 | value.then(wrappedCallback, wrappedErrback); |
| 6866 | } |
| 6867 | |