v2.5.2
Giriş yap

Ajax Callback

munzevi
432 defa görüntülendi

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?

Cevap yaz
Cevaplar (5)
ebykdrms
760 gün önce

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);
}
munzevi
760 gün önce

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);
munzevi
760 gün önce

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

ebykdrms
760 gün önce
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.

munzevi
760 gün önce

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.