Promise工具函数

213 阅读1分钟

1. 判断一个值是否为 Promise-like 对象(thenable)

  • Promise-like 对象指的是具有 'then' 方法的对象,也就是所谓的 "thenable" 对象。
/**
 * @param {*} value - 要判断的值
 * @returns {boolean} - 如果是 Promise-like 对象返回 true,否则返回 false
 */
export function isPromiseLike(value) {
    return value !== null 
        && (typeof value === 'object' || typeof value === 'function')
        && typeof value.then === 'function';
}


// 使用示例:
const thenable = {
    then: function(resolve) {
        resolve(42);
    }
};
console.log(isPromiseLike(thenable)); // true


// 非 Promise-like 对象
console.log(isPromiseLike(null)); // false
console.log(isPromiseLike(undefined)); // false
console.log(isPromiseLike(42)); // false
console.log(isPromiseLike({})); // false
console.log(isPromiseLike({ then: 42 })); // false

2. 判断一个值是否为原生 Promise 实例

  • 使用 instanceof 判断
  • 只匹配原生 Promise 实例
/**
 * @param {*} value - 要判断的值
 * @returns {boolean} - 如果是 Promise 实例返回 true,否则返回 false
 */
export function isNativePromise(value) {
    return value instanceof Promise;
}


// 原生 Promise
const promise = Promise.resolve(42);
console.log(isPromiseLike(promise)); // true
console.log(isNativePromise(promise)); // true
console.log(isNativePromise(thenable)); // false

3. 判断一个值是否为异步函数

/**
 * @param {*} value - 要判断的值
 * @returns {boolean} - 如果是异步函数返回 true,否则返回 false
 */
export function isAsync(value) {
    return typeof value === 'function' && value.constructor.name === 'AsyncFunction';
}

// 异步函数
const asyncFn = async () => {};
console.log(isAsync(asyncFn)); // true
console.log(isAsync(() => {})); // false
这些工具函数在以下场景特别有用:
  1. 处理可能返回 Promise 或普通值的函数
  2. 实现通用的异步处理逻辑
  3. 在中间件或拦截器中判断返回值类型
  4. 处理第三方库返回的 Promise-like 对象