最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

競(jìng)態(tài)條件Race condition及如何避免的三種方案詳解

 更新時(shí)間:2023年10月18日 09:10:59   作者:熱飯班長(zhǎng)  
這篇文章主要為大家介紹了競(jìng)態(tài)條件Race condition及如何避免的三種方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是競(jìng)態(tài)條件?

當(dāng)你的程序依賴正確的響應(yīng)順序,但響應(yīng)的順序又無(wú)法保證時(shí),可能會(huì)導(dǎo)致意外的結(jié)果,這就是競(jìng)態(tài)條件。

舉個(gè)用戶界面的例子:

在上圖中,分別點(diǎn)擊科技和生活tab時(shí),期望能夠展示對(duì)應(yīng)的數(shù)據(jù)。

我們來(lái)設(shè)想如下情況:

  • 點(diǎn)擊科技按鈕(高亮科技按鈕)(數(shù)據(jù)2秒后返回)
  • 點(diǎn)擊生活按鈕(高亮生活按鈕)(數(shù)據(jù)1秒后返回)
    最終,展示區(qū)域會(huì)在1秒后顯示生活數(shù)據(jù),2秒后展示科技數(shù)據(jù),但此時(shí),我們的按鈕會(huì)高亮?xí)谏钌?,但我們的展示區(qū)域顯示的卻是科技數(shù)據(jù)。也就是高亮的按鈕和展示數(shù)據(jù)不同步,這就是競(jìng)態(tài)條件造成的問(wèn)題。

如何避免?

方案1:每次操作完成之前,阻止新的操作

這個(gè)方案用的比較普遍,具體思路就是請(qǐng)求發(fā)生期間,添加一個(gè)loading遮罩層,這樣在當(dāng)前請(qǐng)求響應(yīng)之前,后續(xù)的操作都會(huì)被loading遮罩層避免掉,也就不會(huì)有競(jìng)態(tài)問(wèn)題的發(fā)生。

方案2:每次發(fā)送請(qǐng)求時(shí),丟掉上一個(gè)請(qǐng)求的響應(yīng)

該方案的思路是,在響應(yīng)完成之前,如果用戶有新的請(qǐng)求,那就丟棄掉未完成的請(qǐng)求,其結(jié)果就是只對(duì)最新的請(qǐng)求進(jìn)行響應(yīng),也就避免出現(xiàn)舊的請(qǐng)求響應(yīng)數(shù)據(jù)展示在了當(dāng)前高亮視圖下。

function getResolveWhenLast() {
    let globalId = 0;
    return (pro) => {
    return new Promise((resolve, reject) => {
      const id = ++globalId;
      pro
        .then((res) => {
          if (id === globalId) {
              resolve(res);
          }
        })
        .catch(err => {
          if (id === globalId) {
              reject(err);
          }
        })
    })
    }
}
const resolveWhenLast = getResolveWhenLast()
// 使用resolveWhenLast包住你的請(qǐng)求,就可以解決競(jìng)態(tài)問(wèn)題
resolveWhenLast(api.getPosts()).then(res => {
    // ...
})

方案3:每次發(fā)送請(qǐng)求時(shí),取消掉上一次的請(qǐng)求

給promise加了一層包裝,添加了cancel的能力,每次請(qǐng)求發(fā)出的時(shí)候,將上一次的請(qǐng)求取消掉,同樣達(dá)到了只最處理最新一次請(qǐng)求響應(yīng)的目的,也就避免了競(jìng)態(tài)條件的發(fā)生。

// 給Promise添加取消請(qǐng)求的能力
function createImpretivePromise(pro) {
  let resolve = null;
  let reject = null;
  const warppedPromise = new Promise((_resolve, _reject) => {
      resolve = _resolve;
      reject = _reject;
  })
   pro
    .then((res) => {
      resolve && resolve(res);
    })
    .catch((err) => {
      reject && reject(err);
    });
  // 可以切斷代理
  const cancel = () => {
    resolve = null;
    reject = null;
  }
  return {
    promise: warppedPromise,
    cancel
  }
}
const getResolveWhenLast = () => {
  let globalCancel = null;
  return (pro) => {
    const { promise, cancel } = createImperativePromise(pro);
    globalCancel && globalCancel();
    globalCancel = cancel;
    return promise;
  };
};
const resolveWhenLast = getResolveWhenLast()
// 使用resolveWhenLast包住你的請(qǐng)求,就可以解決競(jìng)態(tài)問(wèn)題
resolveWhenLast(api.getPosts()).then((res) => {
    // ...
});

以上就是競(jìng)態(tài)條件Race condition及如何避免的三種方案詳解的詳細(xì)內(nèi)容,更多關(guān)于競(jìng)態(tài)條件 Race condition的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在js中修改html body的樣式

    在js中修改html body的樣式

    這篇文章主要介紹了在js中修改html body的樣式,下面文章圍繞js修改html 和body樣式的相關(guān)資料展開詳細(xì)內(nèi)容,需要的朋友可以參考一下,希望對(duì)大家有所幫助
    2021-11-11
  • javascript Number 與 Math對(duì)象的介紹

    javascript Number 與 Math對(duì)象的介紹

    這篇文章主要介紹了javascript Number 與 Math對(duì)象,文章圍繞 Number 與 Math對(duì)象的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-11-11
  • 深入淺出探究JavaScript中的async與await

    深入淺出探究JavaScript中的async與await

    任意一個(gè)名稱都是有意義的,先從字面意思來(lái)理解。async 是“異步”的簡(jiǎn)寫,而 await 可以認(rèn)為是 async wait 的簡(jiǎn)寫。所以應(yīng)該很好理解 async 用于申明一個(gè) function 是異步的,而 await 用于等待一個(gè)異步方法執(zhí)行完成。下文將帶你深入探究JavaScript中的async與await
    2021-09-09
  • JavaScript 中有了Object 為什么還需要 Map 呢

    JavaScript 中有了Object 為什么還需要 Map 呢

    Map 是用于存儲(chǔ)鍵值的,而 JavaScript 中對(duì)象也是由鍵值對(duì)組成的,那么 Map 存在的意義是什么呢?下面文章小編就來(lái)向大家詳細(xì)介紹吧,需要的朋友可以參考下
    2021-09-09
  • JavaScript的function函數(shù)詳細(xì)介紹

    JavaScript的function函數(shù)詳細(xì)介紹

    這篇文章主要介紹了JavaScript的function函數(shù)詳細(xì),而我們的JavaScript腳本語(yǔ)言比較特殊,相對(duì)于C語(yǔ)言,它的參數(shù)是不需要數(shù)據(jù)類型加持的。返回值return,我就不過(guò)多描述,他是和 C語(yǔ)言通的,如果沒(méi)寫他就會(huì)自動(dòng)返回undefined,下面一起來(lái)看看文章內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 微信小程序  checkbox組件詳解及簡(jiǎn)單實(shí)例

    微信小程序 checkbox組件詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了微信小程序 checkbox組件詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 微信小程序 sha1 實(shí)現(xiàn)密碼加密實(shí)例詳解

    微信小程序 sha1 實(shí)現(xiàn)密碼加密實(shí)例詳解

    這篇文章主要介紹了微信小程序 sha1 實(shí)現(xiàn)密碼加密實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • autojs使用intent發(fā)送郵件帶附件實(shí)現(xiàn)示例

    autojs使用intent發(fā)送郵件帶附件實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了autojs使用intent發(fā)送郵件帶附件實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Fabric.js 實(shí)現(xiàn)變換視窗示例詳解

    Fabric.js 實(shí)現(xiàn)變換視窗示例詳解

    這篇文章主要為大家介紹了Fabric.js 實(shí)現(xiàn)變換視窗示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • app場(chǎng)景下uniapp的掃碼記錄

    app場(chǎng)景下uniapp的掃碼記錄

    這篇文章主要為大家介紹了app場(chǎng)景下uniapp的掃碼記錄實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論

枣强县| 营山县| 永顺县| 河间市| 曲阳县| 时尚| 阿城市| 长春市| 焉耆| 清涧县| 云安县| 甘洛县| 射阳县| 温泉县| 枣阳市| 浮山县| 景洪市| 郧西县| 扶沟县| 义马市| 嘉义县| 泾源县| 防城港市| 京山县| 丰台区| 武威市| 张家界市| 铁岭市| 蓝山县| 阿坝| 修武县| 黎平县| 金华市| 大邑县| 太康县| 凤庆县| 宿松县| 胶南市| 嘉义市| 芜湖市| 荔波县|