Promise
Promise 穿透
Promise.resolve("yes ok")
  .then(Promise.resolve("not ok"))
  .then((v) => {
    console.log("2", v);
  });
// 2 yes ok想不到吧,如果 then 链中传递的不是一个 function,会解析为 then(null),前面 resolve 的值会透传!
Promise.resolve("yes ok")
  .then(null)
  .then((v) => 123)
  .then(null)
  .then((v) => {
    console.log(v); // 123
  });因此记住:永远都是往 then() 中传递函数!
来自:这篇 (opens in a new tab)(虽然是 15 年的文章,但是对 promise 的理解很好了)
Promise.try (opens in a new tab)
兼容性:chrome 128(2024/8/20),较新的 API,但可以先来了解一下
一个静态的方法,接受一个函数(不论是同步/异步,返回或者 throw)都会将它的结果包装成一个 Promise
Promise.try(func);
Promise.try(func, arg1);
Promise.try(func, arg1, arg2);
Promise.try(func, arg1, arg2, /* …, */ argN);返回值:Promise
- fulfilled:函数同步的返回了一个值
 - rejected:函数同步的 throw 了 error
 - 异步 fulfilled 或者 rejected:函数返回了一个 promise
 
用法
new Promise((resolve) => resolve(func()));需要包裹一个函数的返回成 promise,可以直接
Promise.try(func);但注意的是,不等价于下面的写法
Promise.resolve().then(func);
// 因为这里其实是在异步的执行 func所有 Promise 签名的 Class 都可以实现这样的 try 方法(注意这个不应该被作为 polyfill)
Promise.try = function (func) {
  return new this((resolve, reject) => {
    try {
      resolve(func());
    } catch (error) {
      reject(error);
    }
  });
};