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 的理解很好了)

译文 (opens in a new tab)

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);
    }
  });
};