class myPromise {
    constructor(executor) {
        this.state = 'pending';
        this.value = undefined;
        this.reason = undefined;
        // 成功存放的数组
        this.onResolvedCallbacks = [];
        // 失败存放法数组
        this.onRejectedCallbacks = [];
        let resolve = value => {
            if (this.state === 'pending') {
                this.state = 'fulfilled';
                this.value = value;
                // 一旦resolve执行,调用成功数组的函数
                this.onResolvedCallbacks.forEach(fn => fn());
            }
        };
        let reject = reason => {
            if (this.state === 'pending') {
                this.state = 'rejected';
                this.reason = reason;
                // 一旦reject执行,调用失败数组的函数
                this.onRejectedCallbacks.forEach(fn => fn());
            }
        };
        try {
            executor(resolve, reject);
        } catch (err) {
            reject(err);
        }
    }
    then(onFulfilled, onRejected) {
        let p2Resolve
        let p2Reject
        let p2 = new myPromise((resolve, reject) => {
            p2Resolve = resolve
            p2Reject = reject
        })
        if (this.state === 'fulfilled') {
            onFulfilled(this.value);
            p2Resolve()
        };
        if (this.state === 'rejected') {
            onRejected(this.reason);
            p2Reject()
        };
        // 当状态state为pending时
        if (this.state === 'pending') {
            // onFulfilled传入到成功数组
            this.onResolvedCallbacks.push(() => {
                onFulfilled(this.value);
                p2Resolve()
            })
            // onRejected传入到失败数组
            this.onRejectedCallbacks.push(() => {
                onRejected(this.reason);
                p2Reject()
            })
        }
        return p2
    }
}
let p = new myPromise(function (resolve, reject) {
    setTimeout(() => {
        console.log('任务执行完了');
        resolve()
    }, 1500)
});

p.then(function (value) {
        console.log('第一个成功回调')
    }, function () {})
    .then(function () {
        console.log('第二个成功回调')
    }, function () {});