Created
January 2, 2018 19:00
-
-
Save abdurrahmanekr/349142a7598dfdcd59097638befd0007 to your computer and use it in GitHub Desktop.
promise ile ilgili bir soru
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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]; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Bu sistemi çok basit bir şekilde çözdüm (Teşekkürler doruk):