CHROME UZANTILARI: İleti iletimini birden çok kez nasıl çalıştırabilirim?

0

Soru

Bir Chrome uzantısı üreten bir proje üzerinde çalışıyorum. Bir arka plan sayfasında adında bir işlevim var checkingProcess. Bu işlev, yeni bir sekme açıldığında veya sekme güncelleştirildiğinde yürütülür. (URL değişikliğini burada yakalamaya çalıştım.)

chrome.tabs.onActivated.addListener((activeInfo) => {
  checkingProcess(activeInfo.tabId)
})

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  checkingProcess(tab.id)
})

Sonra checkingProcess işlev, veri işleme ve API çağrıları için bazı işlevlerim var. Sonra pop-up'tan gelen bir mesaj almaya çalıştım. Bu ileti, açılır pencerenin kullanıcı tarafından açıldığını gösterir.

 chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    if (request.msg === 'popup_opened') {
      sendResponse({
        matches_length: response['matches'].length,
        hostname: host,
      })
    }
    chrome.runtime.lastError
  })

Bundan sonra, açılır pencereye bir yanıt gönderir. Açılan pencerede mesajı dinlerim ve açılan pencerede yanıtı kullanırım.

 useEffect(() => {
    chrome.runtime.sendMessage({ msg: 'popup_opened' }, (res) => {
      setHostname(res['hostname'])
      setMatchesLength(res['matches_length'])
      console.log(res['hostname'], 'burası')
      console.log(res['matches_length'], 'burası')
    })
  }, [])

Ancak, bu ileti işleminin yalnızca bir kez yürütüldüğünün farkındayım, ancak arka plandaki verilere aynı anda erişmek için birden çok kez çalıştırmam gerekiyor. Bunu nasıl yapabilirim?

1

En iyi cevabı

1

Mesajınız yalnızca bir kez gönderilir, çünkü şu anda bir React.useEffect boş bir bağımlılık listesiyle. Bu, bileşeniniz monte edildiğinde bu kodun yalnızca bir kez çalıştırılacağı anlamına gelir. "Birden çok kez" çalıştırmak istiyorsanız, önce bunun ne anlama geldiğini tanımlamanız gerekir mi? Örnekler şunlardır:

  • Yürütür sendMessage bir kullanıcı bir düğmeyi tıklatmak gibi bir işlem gerçekleştirdikten sonra. Bu durumda ihtiyacınız yok useEffect. Bunun yerine, bir olay işleyicisini bu düğmeye bağlayın ve sendMessage orada.
  • Yürütür sendMessage bileşeninizi yeniden oluşturduktan sonra. Boş bağımlılık listesini kaldırmanız yeterlidir ([] den senin useEffect yöntem. Not: bunu dikkatli kullanın. Bileşeninizi sık sık yeniden işleyecek şekilde kurarsanız, bu hızlı bir şekilde birçok API çağrısının yapıldığı bir duruma dönüşebilir.
  • Yürütür sendMessage bileşeninizdeki bazı durumlar değiştikten sonra. Bu değişkeni bağımlılıklar listesine ekleyin: [loaded]
  • Yürütür sendMessage her 10 saniyede bir. Kullanmak isteyeceksiniz setInterval senin içinde useEffect, böyle:
useEffect(() => {
  const interval = setInterval(() => {
    chrome.runtime.sendMessage({ msg: 'popup_opened' }, (res) => {
      setHostname(res['hostname'])
      setMatchesLength(res['matches_length'])
      console.log(res['hostname'], 'burası')
      console.log(res['matches_length'], 'burası')
    })
  }, 10000);
  return () => clearInterval(interval);
}, []);
2021-11-22 13:42:25

Açık açılır pencereyi kullandığımda tekrar çalışmasını istiyorum.
Ceren Keklik

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................