菜大王uniapp开发
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

82 lines
2.1 KiB

/**
* 检查目标是否为pending状态的Promise或异步函数
* @param {*} target 要检查的目标,可接受Promise、异步函数或同步函数
* @returns {Promise<boolean>} 一个Promise,解析为目标是否为pending状态
*/
async function isPending(target) {
// 如果是异步函数,执行后检查返回的Promise状态
if (isAsyncFunction(target)) {
try {
const promise = target();
return await checkPromisePending(promise);
}
// eslint-disable-next-line unused-imports/no-unused-vars
catch (error) {
return false; // 异步函数执行出错,不是pending状态
}
}
// 如果是Promise对象,直接检查状态
if (isPromise(target)) {
return await checkPromisePending(target);
}
return false; // 既不是异步函数也不是Promise
}
/**
* 检查是否为异步函数
* @param {*} fn 要检查的函数
* @returns {boolean} 是否为异步函数
*/
function isAsyncFunction(fn) {
return typeof fn === "function"
&& (fn.constructor.name === "AsyncFunction"
|| fn.toString().includes("async"));
}
/**
* 检查是否为Promise
* @param {*} obj 要检查的对象
* @returns {boolean} 是否为Promise
*/
function isPromise(obj) {
return obj instanceof Promise
|| (obj && typeof obj.then === "function");
}
/**
* 检查Promise是否为pending状态
* @param {Promise} promise 要检查的Promise对象
* @returns {Promise<boolean>} 一个Promise,解析为Promise是否为pending状态
*/
async function checkPromisePending(promise) {
const pending = Symbol("pending");
try {
const result = await Promise.race([
promise.then(
() => "fulfilled",
() => "rejected",
),
Promise.resolve(pending),
]);
return result === pending;
}
// eslint-disable-next-line unused-imports/no-unused-vars
catch (error) {
return false; // Promise已经rejected
}
}
/**
* 检查是否为Promise或异步函数
* @param {*} target 要检查的目标
* @returns {boolean} 是否为Promise或异步函数
*/
function isAsync(target) {
return isPromise(target) || isAsyncFunction(target);
}
export { isAsync, isPending };