为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据异步调用的持续时间设置 JS 变量

如何根据异步调用的持续时间设置 JS 变量

12345678_0001 2023-11-12 22:16:57
我有这个:this.toggleWaiting()this.results = await this.query(term)this.toggleWaiting()首先,加载旋转器被触发。然后查询运行。当查询功能结束时,加载微调器将关闭。但是,如果我只想显示加载微调器,而查询时间可能超过 0.5 秒,该怎么办?有没有一种简单的方法可以做到这一点?
查看完整描述

2 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

实现此目的的一种方法是将承诺传递给一个函数,该函数将仅在查询花费的时间超过指定时间(使用超时)时this.query(term)处理触发。toggleWaiting


例如,下面的代码接受一个 Promise,waitingFn一个将使用isWaiting状态来调用的函数 ( ),以及timeout可用于指定在显示加载微调器之前要等待的时间。最后,当承诺完成后,我们返回结果:


async function handleWaiting(promise, waitingFn, timeout) {

  let loadingStarted = false;

  let timeoutInstance = null;


  const timeoutPromise = new Promise((res) => {

    timeoutInstance = setTimeout(() => {

      loadingStarted = true;

      waitingFn(true);

    }, timeout);

    return res();

  });


  function onFinished() {

    clearTimeout(timeoutInstance);


    if (loadingStarted) {

      waitingFn(false);

    }

  }


  try {

    const [result] = await Promise.all([promise, timeoutPromise]);

    onFinished();

    return result;

  } catch (ex) {

    onFinished();

    throw ex;

  }

}

handleWaiting您可以像这样调用该函数:


const result = await handleWaiting(this.query(term), (isWaiting) => this.toggleWaiting(), 500);

正如 @FZs 和 @Bergi 所指出的(谢谢你们),下面是由于使用 Promise 构造函数而导致的反模式:


function handleWaiting(promise, waitingFn, timeout) {

  return new Promise((res, rej) => {

     let loadingStarted = false;

   

     const timeoutInstance = setTimeout(() => {

       loadingStarted = true; 

       waitingFn(true);

     }, timeout);


     function onFinished() {

       if (loadingStarted) {

         waitingFn(false);

       }

       clearTimeout(timeoutInstance);

     }

     

     return promise

       .then((result) => {

         onFinished();

         res(result);

       })

       .catch((ex) => {

         onFinished();

         rej(ex);

       });

  });

}


查看完整回答
反对 回复 2023-11-12
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

在我的 alpineJs 对象中 - 我有这个实现:


{

   waiting: false,


   async handleWaiting(promise, timeout) {

       return new Promise((res, rej) => {

           let loadingStarted = false;


           const timeoutInstance = setTimeout(() => {

               loadingStarted = true;

               this.waiting = true;

           }, timeout);


           const onFinished = () => {

               if (loadingStarted) {

                   this.waiting = false;

               }

               clearTimeout(timeoutInstance);

           }


           promise

               .then((result) => {

                   onFinished();

                   res(result);

               })

               .catch((ex) => {

                   onFinished();

                   rej(ex);

               });

       });

    },


    async searchForTerm(term) {

       this.results = await this.handleWaiting(this.$wire.query(term), 500);

       // do something with the results...

    },

 }

非常简单。

查看完整回答
反对 回复 2023-11-12
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信