Sunny-117 / js-challenges

✨✨✨ Challenge your JavaScript programming limits step by step

Home Page:https://juejin.cn/column/7244788137410560055

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

6. Promise.resolve

Sunny-117 opened this issue · comments

Promise.resolve = function (data) {
    if (data instanceof MyPromise) {
      return data;
    }
    return new MyPromise((resolve, reject) => {
      if (isPromise(data)) {
        data.then(resolve, reject);
      } else {
        resolve(data);
      }
    });
  }
commented
Promise.resolve = function (data) {
  if (data instanceof Promise) {
    return data;
  }
  return new Promise((resolve) => {
    resolve(data);
  });
};

instanceof MyPromise和下面的ispromise是不是重复了

@faga295 不重复, 不过确实没补充完全. 这里isPromise应该是要去判断是否thenable.

贴一段V8的源码

if (!IsJSPromiseMap(resolutionMap)) {
      dcheck(IsJSReceiverMap(resolutionMap));
      dcheck(!IsPromiseThenProtectorCellInvalid());
     // 删掉了部分代码....
      return FulfillPromise(promise, resolution);
 }

可见v8在实现resolve时, 把promise和thenable的对象都滤去了, IsJSPromiseMap和IsPromiseThenProtectorCellInvalid这两个函数就是保证最终的value中没有then方法.

事实上你可以试一下:

Promise.resolve({ then: (resolve) => resolve('xx') })
  .then(res => console.log(res))

这里打印出来的并不是一个带有then属性的对象, 而是'xx'

const myPromiseReslove = (data) => {
  if (data && data instanceof Promise) {
    return data;
  } 
  return new Promise((resolve, reject) => {
    if (data && data.then && typeof data.then === 'function') {
      data.then(resolve, reject)
    } else {
      resolve(data)
    }
  }) 
  
}
function myResolve(value) {
  // 如果 value 已经是 Promise 对象,则直接返回该 Promise 对象
  if (value instanceof Promise) {
    return value;
  }
  // 如果 value 是 thenable 对象,则包装成 Promise 对象并返回
  if (value && typeof value.then === 'function') {
    return new Promise(function(resolve, reject) {
      value.then(resolve, reject);
    });
  }
  // 将传入的值作为 Promise 的成功值,并返回 Promise 对象
  return new Promise(function(resolve) {
    resolve(value);
  });
}
commented

Promise.resolve = function (data) {
if (data instanceof Promise) return data;
return new Promise((resolve, reject) => {
resolve(data);
});
};

Promise.resolve = function (data) {
  if (data instanceof Promise) {
    return data;
  }
  return new Promise((resolve) => {
    resolve(data);
  });
};