第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何根據(jù)異步調(diào)用的持續(xù)時(shí)間設(shè)置 JS 變量

如何根據(jù)異步調(diào)用的持續(xù)時(shí)間設(shè)置 JS 變量

12345678_0001 2023-11-12 22:16:57
我有這個(gè):this.toggleWaiting()this.results = await this.query(term)this.toggleWaiting()首先,加載旋轉(zhuǎn)器被觸發(fā)。然后查詢運(yùn)行。當(dāng)查詢功能結(jié)束時(shí),加載微調(diào)器將關(guān)閉。但是,如果我只想顯示加載微調(diào)器,而查詢時(shí)間可能超過 0.5 秒,該怎么辦?有沒有一種簡(jiǎn)單的方法可以做到這一點(diǎn)?
查看完整描述

2 回答

?
月關(guān)寶盒

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊

實(shí)現(xiàn)此目的的一種方法是將承諾傳遞給一個(gè)函數(shù),該函數(shù)將僅在查詢花費(fèi)的時(shí)間超過指定時(shí)間(使用超時(shí))時(shí)this.query(term)處理觸發(fā)。toggleWaiting


例如,下面的代碼接受一個(gè) Promise,waitingFn一個(gè)將使用isWaiting狀態(tài)來(lái)調(diào)用的函數(shù) ( ),以及timeout可用于指定在顯示加載微調(diào)器之前要等待的時(shí)間。最后,當(dāng)承諾完成后,我們返回結(jié)果:


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您可以像這樣調(diào)用該函數(shù):


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

正如 @FZs 和 @Bergi 所指出的(謝謝你們),下面是由于使用 Promise 構(gòu)造函數(shù)而導(dǎo)致的反模式:


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);

       });

  });

}


查看完整回答
反對(duì) 回復(fù) 2023-11-12
?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

在我的 alpineJs 對(duì)象中 - 我有這個(gè)實(shí)現(xiàn):


{

? ?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...

? ? },

?}

非常簡(jiǎn)單。

查看完整回答
反對(duì) 回復(fù) 2023-11-12
  • 2 回答
  • 0 關(guān)注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)