2009-04-20 25 views
6

Sunucuya ajax çağrısı yapmak için genel bir işlevi çağıran javascript işlevi var. Ajax çağrısının geri arama işlevinden bir sonuç (doğru/yanlış) almam gerekir, ancak elde ettiğim sonuç her zaman 'tanımsız' olur.Tanıtımı geri alma açık Arayan Fonksiyon döndürme değerini döndürme değeri

tüm bulunmayan genel işlevinin bir süper basitleştirilmiş versiyonu benim mantık olacaktır:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        return true; 
       else 
        return false; 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

Ve gibi bir şey olurdu çağıran işlevi:

function Next() { 
     var result = CallServer("/Signum/TrySave"); 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    } 

"sonuç" değişkendir her zaman 'tanımsız' ve hata ayıklama geri çağırma işlevinin "geri dönüşü" satırının yürütülmekte olduğunu görebiliyorum.

Bunun neden olduğuyla ilgili herhangi bir fikir var mı? Kabarcık, geri arama işlevinden CallServer işlevine dönüş değerini nasıl yapabilirim? Genellikle herhangi bir kod koymak

Teşekkür

cevap

0

Nasıl yapılacağını buldum :) Bir değişkenin bildirilmesi ve geri arama işlevine göre güncelleştirilmesi. Daha sonra bu değişkeni iade edebilirim. Ben gelecek okuyucular için kod yerleştirin:

function CallServer(urlController) { 
    var returnValue = false; 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic){ 
        returnValue = true; 
        return; 
       } 
      }, 
     error: 
      function(errorThrown) { 
       alert("Error occured: " + errorThrown); 
      } 
     }); 

     return returnValue; 
} 
+10

Şerefe, bu sizin için çalışıyor olabilir, ancak öngörülemeyen bir koddur, çünkü büyük olasılıkla, async POST değerini belirlemeden önce CallServer'dan "returnValue" döndürecektir. Kural Kuralı: Eşzamanlı sarıcılarda eşzamansız çağrıları sarmalamayın! –

+0

, asenkronize çağrılarda beklemenin bir yolu için $ 'a bakabilirsiniz. Http://api.jquery.com/jQuery.when/ – Andbdrew

0

geri arama işlevi kendi içinde başarısı üzerine yürütülecek. Ben CallServer() aslında geri aramaların kendilerinden dönüş değerlerini aldığını sanmıyorum. Ben jQuery ile çok aşina değilim, bu yüzden tamamen yanlış olabilir (Ben YUI gibi diğer çerçeveler davranışı üzerindeki bu kurdum, ve AJAX:

function CallServer(urlController) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: false, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       if (someLogic) 
        document.forms[0].submit(); 
       else 
        // do something else 
      }, 
     error: 
      function(errorThrown) { 
       // handle error 
      } 
    }); 
} 

Düzenleme:

gibi bir şey deneyin herhangi bir çerçeve olmadan yapılan çağrılar. Eğer öyleyse, bu cevabı reddet ve bir yorum bırak, ben de bu cevabı sileceğim.

+0

Cevap Calvin ile ilgili yanlış bir şey yok;) Sorun, doğrulama amacıyla tamamen genel bir işlev olmasıdır, bu nedenle doğrulama işlemi başarılı olursa kodu orada yapamıyorum. Bir şekilde Callserver'ın boolean'ı döndürmesini sağlamalıyım. Neyse – antonioh

15

Just in case (istek yaparken bunun tarayıcı donma olmaz çünkü daha iyi bir çözüm olan) asenkron şekilde gitmek istiyorum, burada kodudur:

function CallServer(urlController, callback) { 
    $.ajax({ 
     type: "POST", 
     url: urlController, 
     async: true, 
     data: $("form").serialize(), 
     success: 
      function(result) { 
       var ret = (someLogic); 
       callback(ret); 
      }, 
     error: 
      function(errorThrown) { 
       return false; 
      } 
    }); 
} 

function Next() { 
    CallServer("/Signum/TrySave", function(result) { 
     if (result == true) { 
      document.forms[0].submit(); 
     } 
    }); 
} 
+0

Fonksiyonumun senkronize olması gerekiyordu, ancak bu değerleri geri döndürmenin yolunu bilmiyordum. bazen yararlı olabilir, bu yüzden teşekkürler! – antonioh

İlgili konular