(
promise: ZoneAwarePromise<any>,
state: boolean,
value: any,
)
| 135 | |
| 136 | // Promise Resolution |
| 137 | function resolvePromise( |
| 138 | promise: ZoneAwarePromise<any>, |
| 139 | state: boolean, |
| 140 | value: any, |
| 141 | ): ZoneAwarePromise<any> { |
| 142 | const onceWrapper = once(); |
| 143 | if (promise === value) { |
| 144 | throw new TypeError(TYPE_ERROR); |
| 145 | } |
| 146 | if ((promise as any)[symbolState] === UNRESOLVED) { |
| 147 | // should only get value.then once based on promise spec. |
| 148 | let then: any = null; |
| 149 | try { |
| 150 | if (typeof value === 'object' || typeof value === 'function') { |
| 151 | then = value && value.then; |
| 152 | } |
| 153 | } catch (err) { |
| 154 | onceWrapper(() => { |
| 155 | resolvePromise(promise, false, err); |
| 156 | })(); |
| 157 | return promise; |
| 158 | } |
| 159 | // if (value instanceof ZoneAwarePromise) { |
| 160 | if ( |
| 161 | state !== REJECTED && |
| 162 | value instanceof ZoneAwarePromise && |
| 163 | value.hasOwnProperty(symbolState) && |
| 164 | value.hasOwnProperty(symbolValue) && |
| 165 | (value as any)[symbolState] !== UNRESOLVED |
| 166 | ) { |
| 167 | clearRejectedNoCatch(value); |
| 168 | resolvePromise(promise, (value as any)[symbolState], (value as any)[symbolValue]); |
| 169 | } else if (state !== REJECTED && typeof then === 'function') { |
| 170 | try { |
| 171 | then.call( |
| 172 | value, |
| 173 | onceWrapper(makeResolver(promise, state)), |
| 174 | onceWrapper(makeResolver(promise, false)), |
| 175 | ); |
| 176 | } catch (err) { |
| 177 | onceWrapper(() => { |
| 178 | resolvePromise(promise, false, err); |
| 179 | })(); |
| 180 | } |
| 181 | } else { |
| 182 | (promise as any)[symbolState] = state; |
| 183 | const queue = (promise as any)[symbolValue]; |
| 184 | (promise as any)[symbolValue] = value; |
| 185 | |
| 186 | if ((promise as any)[symbolFinally] === symbolFinally) { |
| 187 | // the promise is generated by Promise.prototype.finally |
| 188 | if (state === RESOLVED) { |
| 189 | // the state is resolved, should ignore the value |
| 190 | // and use parent promise value |
| 191 | (promise as any)[symbolState] = (promise as any)[symbolParentPromiseState]; |
| 192 | (promise as any)[symbolValue] = (promise as any)[symbolParentPromiseValue]; |
| 193 | } |
| 194 | } |
no test coverage detected
searching dependent graphs…