亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據異步調用的持續時間設置 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 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號