/**
* 仅执行一次
* @param fun 只执行一次的方法
* @returns
*/
export function once(fun) {
  let result;
  let callCount = 0;

  return function (...args) {
    if (callCount !== 0) {
      return result;
    }
    callCount += 1;
    return (result = fun.apply(null, args));
  };
}
/**
* 仅成功成功一次
* @param fun 只执行成功一次的方法
* @returns
*/
export function oncePromiseResolve(fun) {
  let tempPromise;
  let calling = false;

  return function (...args) {
    if (calling) return tempPromise;
    calling = true;
    return (tempPromise = (async () => {
      try {
        return await fun(...args);
      } catch (err) {
        calling = false;
        throw err;
      }
    })())
  };
}

// /**
//  * 请求带超时
//  * @param {() => Promise<any>} fun 
//  * @param {number} [time] 超时时长 
//  * @param {string} [errMsg] 报错信息
//  * @returns 
//  */
// export function withTimeOut(fun, time = 60 * 1000, errMsg = 'call timeout') {
//   return (...params) => {
//     return new Promise((resolve, reject) => {
//       // 计时器
//       const timer = setTimeout(() => (terminate(), reject(errMsg)), time);

//       // 终止
//       const terminate = () => clearTimeout(timer);
      
//       // 调用
//       return fun(...params).then(resolve).catch(reject).finally(terminate)
//     })
//   }
// }
