2014-04-13 16 views
6

Dış işlevlerin yapması gereken bazı durumları tanımlamak için bir dış değişken kullanabileceğimi biliyorum. Ama şunu düşünün: İç işlev eşzamansız mı? Dış fonksiyon, iç fonksiyon değişkeni değişmeyecek, bu yüzden dış fonksiyonu şimdi nasıl iade edebilirim? Ben dönüş değeri olarak flag kullanırsanızJavaScript: Eşzamansız bir iç işlev içinde bir dış işlev nasıl döndürülür?

function outer() { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function(jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
     } 
    }); 
    return flag; 
} 

Yani, gördüğünüz gibi, outer() çok muhtemel dönüş gerçek ajax çağrısı uzun zaman alabilir çünkü. Ve aynı sebepten dolayı, async: false'u ayarlamak istemiyorum çünkü bu sayfa reaksiyonunu durduracaktır.

+1

Bu, eşzamansız akışlarla mümkün değil, ajax isteği tamamlandığında aradığınız 'dış (cb)' parametresine bir geri arama yöntemi eklemenizi öneririm. – olsn

+0

Evet haklısın, yanlış düşünüyordum. – Melkor

cevap

6

outer işleviniz hemen geri dönecektir, böylece true değerini flag değeri olarak elde edersiniz. Doğru değeri elde etmek için, async işlevinin işini yapmasına ve hazır olduğunda size geri dönmesine izin vermeniz gerekir. Şunu bir düşünün:

function outer(cb) { 
    var flag = true; 
    // For example, a jquery-like ajax call 
    $.ajax({ 
     // Some settings 
     error: function (jqXHR, textStatus, errorThrown) { 
      // Here I want to return outer() 
      flag = false; 
      cb(flag); 
     }, 
     success: function() { 
      flag = true; // or whatever value you need. 
      cb(flag); 
     } 
    }); 
} 

function callback(flag) { 
    // this function will be called after the ajax is complete. 
    // real value of flag variable will be available here 
    console.log(flag); 
} 
outer(callback); 

Sen dış işleve parametre olarak bir işlev geçmesi ve ajax parametre olarak ihtiyaç değeri ile tamamlandığında bu işlevi çağırır. Böylece gerçek sonucu elde edersiniz.

+0

Teşekkür ederim, ama hemen geri vermem gerekiyor. Şimdi bunun sadece async: false ile aynı olduğunu anlıyorum. Bu yüzden başka yollar bulacağım. – Melkor