Skip to content

Instantly share code, notes, and snippets.

@abdurrahmanekr
Created January 2, 2018 19:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abdurrahmanekr/349142a7598dfdcd59097638befd0007 to your computer and use it in GitHub Desktop.
Save abdurrahmanekr/349142a7598dfdcd59097638befd0007 to your computer and use it in GitHub Desktop.
promise ile ilgili bir soru
// En basit şekilde cache mantığı ile çalışan bir vCard servisi
// get methodu ile servisten aldığı değeri vCards'a ekliyor
// o listede de varsa geri döndürüyor
class vCard {
constructor() {
// hazırda inmiş vCard listesi
this.vCards = [];
}
get(id) {
var self = this;
return new Promise((resolve) => {
var available = self.vCards.find(x => x.id === id);
// mevcutta vCard varsa onu döndürüyor
if (available !== undefined) {
resolve(available);
return;
}
// yoksa servisten istiyor
fetch(`https://api.com/${id}`)
.then(res =>
resolve(res);
})
})
}
}
// Bu vCard servisi ise sürekli istendiğinde yani defalarca çağrılmasına rağmen
// o anki isteğe göre hazırda bekleyen promise'ı döndürüyor
class vCard {
constructor() {
// hazırda inmiş vCard listesi
this.vCards = [];
// hazırda istek atılmış promise listesi
this.requests = {};
}
get(id) {
var self = this;
// eğer önceden bir istek barınıyorsa
if (this.requests[id] !== undefined)
return this.requests[id];
// promise'ı atıyor
this.requests[id] = new Promise((resolve) => {
var available = self.vCards.find(x => x.id === id);
// mevcutta vCard varsa onu döndürüyor
if (available !== undefined) {
resolve(available);
// işlem bittiğinde ise requests listesinden silinmesi gerekiyor
// fakat daha this.requests[id] değerine bu promise atanmadığından
// yani değişkene atılacak promise'ın önceden çalışması gerektiği için önce burası çalışıyor
// sonra this.requests[id] değeri dolduruluyor bu yüzden bu delete çalışmıyor.
delete self.requests[id];
return;
}
// yoksa servisten istiyor
fetch(`https://api.com/${id}`)
.then(res => {
resolve(res);
// aynı şekilde buradan da silinmesi gerekiyor
delete self.requests[id];
})
})
// geriyede promise'ı döndürüyor
return this.requests[id];
}
}
// Ben bu sistemi setTimeout ile çalışabilir bir şekile getirdim fakat buna ne kadar güvenebilirim, emin değilim.
// Scope mantığını biliyorum ancak bu sistem bu şekilde mi olmalı sizce?
// get methodunun çalışır durumu:
get(id) {
var self = this;
// eğer önceden bir istek barınıyorsa
if (this.requests[id] !== undefined)
return this.requests[id];
// promise'ı atıyor
this.requests[id] = new Promise((resolve) => {
setTimeout(() => {
// ...
// üstteki kodun aynısı
}, 0);
});
// geriyede promise'ı döndürüyor
return this.requests[id];
}
@abdurrahmanekr
Copy link
Author

abdurrahmanekr commented Jan 4, 2018

Bu sistemi çok basit bir şekilde çözdüm (Teşekkürler doruk):

get(id) {
    var self = this;
    // eğer önceden bir istek barınıyorsa
    if (this.requests[id] !== undefined)
        return this.requests[id];

    // promise'ı atmak yerine geriye promise döndüren bir fonksiyon atıyoruz
    this.requests[id] = () => new Promise((resolve) => {
            // ...
            // üstteki kodun aynısı
    });
    // geriyede fonksiyonu çağırıp değişkene atamak kalıyor
    this.requests[id] = this.requests[id]();
    return this.requests[id];
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment