|
123456789101112131415161718192021222324252627282930313233343536373839 |
- 'use strict'
-
- const constants = require('./constants')
- const unwrapSync = require('./unwrapSync')
-
- // Behaves like a Promise, though the then() and catch() methods are unbound and
- // must be called with the instance as their thisArg.
- //
- // The executor must either return a value or throw a rejection reason. It is
- // not provided resolver or rejecter methods. The executor may return another
- // thenable.
- class Thenable {
- constructor (executor) {
- try {
- this.result = unwrapSync(executor())
- this.state = constants.RESOLVED
- } catch (err) {
- this.result = err
- this.state = constants.REJECTED
- }
- }
-
- then (onFulfilled, onRejected) {
- if (this.state === constants.RESOLVED && typeof onFulfilled === 'function') {
- return new Thenable(() => onFulfilled(this.result))
- }
-
- if (this.state === constants.REJECTED && typeof onRejected === 'function') {
- return new Thenable(() => onRejected(this.result))
- }
-
- return this
- }
-
- catch (onRejected) {
- return this.then(null, onRejected)
- }
- }
- module.exports = Thenable
|