判断变量是否为 promiselike 的核心是:它必须是非空的对象或函数,且具有可调用的 then 方法;该定义源于 promise/a+ 规范中的 thenable 概念,兼容原生及第三方 promise 实例,无需检查 catch。

判断一个变量是否为 PromiseLike,核心就一条:它得是个对象或函数,并且拥有一个可调用的 then 方法。
什么是 PromiseLike
PromiseLike 不是标准类型,而是指“类 Promise”对象——即符合 Promise/A+ 规范中对 thenable 的定义:任何具有 then 方法、能被 Promise.resolve() 正常接纳并处理的值。它不一定是原生 Promise 实例,比如 Bluebird、Q 等第三方 Promise 库的实例,或手写的带 then 的对象,都属于 PromiseLike。
最常用且实用的判断逻辑
只需三步检查:
- 变量不为
null或undefined - 类型是
"object"或"function" typeof value.then === "function"
写成函数就是:
function isPromiseLike(value) {return value != null &&
(typeof value === 'object' || typeof value === 'function') &&
typeof value.then === 'function';
}
为什么不用 instanceof Promise?
instanceof 只能识别原生 Promise 构造器创建的实例,对跨 iframe、不同环境(如 Web Worker)、或第三方 Promise 类(如 Bluebird)会返回 false,但它们仍是合法的 PromiseLike。所以 instanceof 更适合“是不是原生 Promise”,而不是“能不能当 Promise 用”。
要不要加 catch 检查?
不必。Promise/A+ 规范只要求实现 then 方法;catch 是 then(null, onRejected) 的语法糖,不是必需的。强行加 typeof value.catch === 'function' 反而会漏判合法的 PromiseLike(比如某些轻量 thenable 对象只实现了 then)。











