2014-04-13 24 views
6

Tôi biết tôi có thể sử dụng biến ngoài để xác định một số trạng thái mà hàm bên ngoài cần thực hiện. Nhưng hãy xem xét điều này: Nếu hàm bên trong là không đồng bộ? Hàm bên ngoài sẽ không đợi cho biến của hàm bên trong sẽ thay đổi, vậy làm thế nào tôi có thể trả về hàm ngoài bây giờ?JavaScript: Cách trả về hàm bên ngoài bên trong hàm bên trong không đồng bộ?

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; 
} 

Như bạn có thể thấy, nếu tôi sử dụng flag như giá trị trả về, outer() sẽ rất có khả năng trở thành sự thật vì cuộc gọi ajax có thể mất một thời gian dài. Và vì lý do tương tự, tôi không muốn đặt async: false vì điều đó sẽ ngừng phản ứng trang.

+1

Điều đó là không thể với các luồng không đồng bộ, tôi khuyên bạn nên thêm phương thức gọi lại làm tham số cho 'outer (cb)' mà bạn gọi khi yêu cầu ajax hoàn tất. – olsn

+0

Có đúng, tôi đã suy nghĩ sai. – Melkor

Trả lời

6

Chức năng outer của bạn sẽ trở lại ngay lập tức, vì vậy bạn sẽ luôn nhận được true làm giá trị flag. Để có được giá trị phù hợp, bạn cần phải để chức năng async thực hiện công việc của nó và lấy lại cho bạn khi nó đã sẵn sàng. Hãy xem xét điều này:

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); 

Bạn chuyển hàm đó khi hàm ajax hoàn thành với giá trị bạn cần làm tham số. Bằng cách này bạn sẽ nhận được kết quả thực sự.

+0

Cảm ơn bạn, nhưng tôi thực sự cần trả lại ngay lập tức. Bây giờ tôi nhận ra rằng nó chỉ giống như 'async: false'. Vì vậy, tôi sẽ tìm một số cách khác. – Melkor

Các vấn đề liên quan