v2.5.2
Giriş yap

chrome.storage.local fiyaskosu

munzevi
415 defa görüntülendi ve 2 kişi tarafından değerlendirildi

merhaba,

bir borsa eklentisi yazıyorum. normalde sunucuda yapacaktım, ama kişi tarayıcı eklentisini tercih etti. sinirden beynimden vurulmuşa döndüm.

standart localStorage kullanımını bilmeyen yoktur herhalde

let lSet = (name, value) => localStorage.setItem(name, value),
    lGet = name => localStorage.getItem(name);

ne güzel sade kısa öz, kullanılabilir. üstelik boolean türünde veride döndürüyor sorguladığınızda

var data = localStorage.getItem('data') ?
    localStorage.getItem('data') :
localStorage.setItem('data', 'data verisi');

sorguladım varsa seç, yoksa oluştur öyle seç dedim. pratik. ister döngüye al kullan, ister bir tane kullan

data.obj.forEach(([key => val]) =>{
    localStorage(key, val);
});

bir anda yüzlerce bile oluşturabildim. peki google napmış? bu güzelim yöntemi eklentiler için devre dışı bırakmış,

let data = {},
    lSet = (name, value) => {
        chrome.storage.local.set({[name]: value}, function() {
            data[name] = value;
        });
    },
    lGet = name => {
        chrome.storage.local.get([name], function(result) {
            return result.key;
        });
    },

hadi al sok bunu döngüye. değerin ne olduğu, nereye gittiği belli değil. bu kadar yorucu bi yöntem olur mu ya, hammallık resmen bu. arkadaş ben niye yöntem yazıp, içerisinde callback olarak tanımlama yapmak zorundayım. standart kullanımın yalın haliyle bile, ayarların konfigürasyonu ve verilerin çerez olarak depolanması için 479 satırlık sınıf yazdım. bu şekilde yaparsam, çoğu veriyi döngüye alamam uygun değil. çoklu dil desteğinden, çok sayıda form elemanlarının ayarına kadar veriyi localStorage de tuttum. tutmak zorundayım çünkü statik bir veri yok ortada. ne yapayım şimdi ben, iptal mi edeyim siparişi? hayır en çok zoruma giden? niye yani niye niye neşter dururken döner bıçağıyla ameliyata yolluyor beni google. set ettiğim değeride geri alamıyorum bu arada, anca get içerisinde calback yapacağım orda da kullanmak istediğim veriyle değişkeni eşitleyeceğim.

lütfen birileri benim görmediğim olumlu bir tarafını görüyorsa bu durumun, bana da göstersin.

munzevi
680 gün önce

ilk şoku atlatıp, sinir krizim geçince oturup yazmaya devam ettim : )
ama mantıksız olan bir noktada takıldım.

burada diyorum ki, chrome.storage.local.get yönteminde belirtilen anahtar yoksa yenisini oluştur, daha sonrasında callback ile boş nesneye dönen sonucu aktarıyorum;

        let conf = {};
        Object.entries(this.storageData().data).forEach(([key, val]) => {
            chrome.storage.local.get(key, object => {
                if(!object[key])
                    chrome.storage.local.set(
                        {[key]:val},
                        function(){
                            Object.assign(conf, {[key]:val})
                        }
                    );
            });
        });

yukarıdaki kod, ilk girişte çalıştırılacak bir kod, daha sonraki oturumlarda ihtiyaç duyulmayacak. dolayısıyla bu seferde mevcut depolanan verileri okumam gerkekiyor;

        chrome.storage.local.get(null, items => {
            Object.assign(conf, items);
        });

onu da bununla hallediyorum.

<a href="https://imgur.com/LZjSic1.png&quot; target="_blank">şimdi sorun tam şu noktada ortaya çıkıyor;</a>

        console.log(
            this.conf,
            this.conf.lang,
            conf,
            conf.lang
        );

this.conf ve conf tuttuğu tüm objeleri consola basıyor, ama this.conf.lang ve conf.lang undefined dönüyor.
bitti mi bitmedi,

            new Intl
            .DateTimeFormat(conf.lang, {
            weekday: 'long',
            year: 'numeric',
            month: 'long',
            day: 'numeric',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
            timeZoneName: 'longGeneric',
            timeZone: conf.timeZone
        }).format(new Date(Date.now()));

aynı bloğun içinde olan bu kodda conf.lang undefined dönmüyor.

<span style="color:red;font-size:16px;font-family:sans">bu durumun sebebi ne olabilir?</span>

tam kod örneği;

        let conf = {};
        Object.entries(this.storageData().data).forEach(([key, val]) => {
            chrome.storage.local.get(key, object => {
                if(!object[key])
                    chrome.storage.local.set(
                        {[key]:val},
                        function(){
                            Object.assign(conf, {[key]:val})
                        }
                    );
            });
        });
        chrome.storage.local.get(null, items => {
            Object.assign(conf, items);
        });
        
        //conf["data"]      = conf.langs[conf.lang];
        conf["now"]       = new Intl
            .DateTimeFormat(conf.lang, {
            weekday: 'long',
            year: 'numeric',
            month: 'long',
            day: 'numeric',
            hour: '2-digit',
            minute: '2-digit',
            second: '2-digit',
            timeZoneName: 'longGeneric',
            timeZone: conf.timeZone
        }).format(new Date(Date.now()));
        this.conf = new Object(conf);
        console.log(
            this.conf,
            this.conf.lang,
            conf,
            conf.lang
        );