SOURCE

// https://juejin.cn/post/7085298532365631501

function Promise1(performer) {
  this.pending = [];
  this.value = undefined;

  const resolve = (value) => {
    this.value = value;
    if (this.pending) {
      for (let onFulfilled of this.pending) {
        onFulfilled(this.value);
      }
      this.pending = undefined;
    }
  };
  performer(resolve)
}

Promise1.prototype.then = function (onFulfilled) {
  const prev = this
  const promise = new Promise1(resolve => {
    const onSpreadFulfilled = function (value) {
      resolve(onFulfilled(value))
    }
    if (prev.pending) {
      prev.pending.push(onSpreadFulfilled)
    } else {
      onSpreadFulfilled(prev.value)
    }
  })
  return promise
}

const p = new Promise1((resolve) => {
  setTimeout(() => resolve(666), 100);
});

// p.then((res) => {
//   console.log(res);
// });

p.then(res => {
  console.log('res1: %s', res);
  return res + 1;
}).then(res => {
  console.log('res2: %s', res);
})
  
console 命令行工具 X clear

                    
>
console