Ajax Callback
Merhaba,
ajax ile istek tamamlandıktan ve yanıt alındıktan sonra, dönen obje değerlerinden bir fonksiyon başlatmak istiyorum ancak tam olarak syntaxı anlamadığım için nasıl yazmam gerektiğinden emin değilim.
{
sinif: "app",
method: "methodAdi",
parametreler: ["parametre1", "parametre2"]
}
dönen değerlerin böyle olduğunu varsayabiliriz.
app.methodAdi(parametre1, parametre2);
düşüncede güzel ama, nasıl?
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (5)
Merhaba,
Ajax isteği sonucunda size metod adı ve parametreler dönüyor ama fonksiyonu ne iş yaptığı dönmüyorsa sanırım bu fonksyonlar sizin sitenizde önceden hazırlanmış olarak bekliyorlar. Siz sadece ajax isteği sonucunda hangi fonksiyonun hangi parametrelerle çalışacağını belirlemeye çalışıyorsunuz. Eğer durum buysa, fonksiyonlarınızı şu şekilde tanımladığınızı varsayalım:
var app = {
merhabaYazdir: function(parametreler=[]) {
var parametreSayisi = parametreler.length;
var ad = parametreSayisi>0 ? parametreler[0] : "";
var soyad = parametreSayisi>1 parameterler[1]; : "";
console.log("Merhaba "+ad+" "+soyad);
},
hoscakalYazdir: function(parametreler) {
var parametreSayisi = parametreler.length;
var ad = parametreSayisi>0 ? parametreler[0] : "";
var soyad = parametreSayisi>1 parameterler[1]; : "";
console.log("Hoşçakal "+ad+" "+soyad);
}
}
Şimdi ajax'tan şöyle bir sonuç geldi diyelim:
{
"sinif": "app",
"method": "merhabaYazdir",
"parametreler": ["Adım", "Soyadım"]
}
Bu durumda ajax'ın success fonksiyonunda şu şekilde bir yazım, fonksiyonu çalıştıracaktır:
function success(response) {
window[response.sinif][response.method](response.parametreler);
}
arkadaşın verdiği ilk cevap doğru olmasına rağmen, bende çalışmadı. geçte olsa sebebini anlayabildim. modül olarak çalışmama dahil ediyorum bütün javascript dosyalarını. global ölçekte hiçbir değer görmüyor. bu yüzden window içerisinde sınıf tanımsız dönüyor. windowu kaldırıp sınıfı önceden bildirince sorun ortadan kalktı.
app[data.method](data.parametre);
app ana sınıfım. bu yüzden this ile içerisindeyken diğer methodları çağrabiliyorum. this'e bu kadar takılmana gerek yoktu. çalışmaya dahil edilen farklı sınıflar mevcut. bu yüzden dediğiniz gibi doğrudan erişim yapmam anlamsız. doğrudan erişim yapacak olsam, istek gönderip yanıt beklemem de anlamsız. şuan eval ile kullanıyorum dönen değerleri ama, eval kullanmak hoşuma gitmiyor. https://prnt.sc/0JS6et_QbB5e bahsettiğiniz kullanımın neden çalışmadığını anlamıyorum, bu yüzden çalışan tüm çağırma yöntemlerini window içinde denedim, this'e takılmayınız yani. resimdekinin aynını doğrudan succes de bildirdiğimde zaman ise https://prnt.sc/WLNfKYRe-Q8G
window["this"]["returnTree"]("false", 1);
satırı sorun çıkarıyor olmalı. window
objesinin this
diye bir key'i yok. Kodunuzun geri kalanını bilmiyorum ama bulunduğunuz blokta this
ile returnsTree
fonksiyonuna erişebiliyorsanız bunu doğrudan yapmalısınız:
this["returnTree"]("false", 1);
Eğer ajax'tan sınıf adı olarak size this
geliyorsa, ajax'ın success()
fonksiyonu içinde olduğunuz için burada this
anahtar sözcüğü muhtemelen sizin kastettiğiniz this
ile aynı değeri taşımıyor. Siz burada this
kullandığınızda ajax'ın sınıfına ulaşıyorsunuz.
Çözüm olarak, eğer size this
geliyorsa bunu hangi sınıfı kastediyorsanız onun değişkenini kullanarak çalıştırmalısınız. Mesela this
aslında app
anlamına geliyorsa bir if
koşuluyla kontrol sağlamalısınız.
bu yöntemi denemiştim ancak, methodu okumuyordu. daha anlaşılır olması için yalın şekilde aşağıya kod ekliyorum.
$.ajax({
url: 'Control',
type: 'POST',
data: form,
dataType: "json",
success: function(data){
console.log(data); //çalışıyor
}
});
buraya kadar sorun yok,
app.returnTree(data.parametre[0], data.parametre[1]);
...
this.returnTree(data.parametre[0], data.parametre[1]);
...
app.returnTree(false, 1);
yukarıdaki kullanımlarda sorun yok hepsinde yanıt alabiliyorum.
window[data.sinif][data.method](data.parametre);
...
window[data.sinif][data.method](data.parametre[0], data.parametre[1]);
...
window["app"]["returnTree"]("false", 1);
...
window["this"]["returnTree"]("false", 1);
//app:91 Uncaught TypeError: Cannot read properties of undefined (reading 'returnTree')
bu şekilde kullandığımda ise methodu okuyamadığına dair bir hata alıyorum.