2011-07-13 38 views
5

Vì vậy, tôi đã có mã JS ở đây, và tôi đang cố gắng thiết lập obj từ lời gọi thành công và lỗi, nhưng rõ ràng phạm vi chức năng toLinkInfo không phải là phạm vi cha mẹ? Tôi luôn luôn nhận được null trở lại từ chức năng này không có vấn đề gì. Tôi đã thử một loạt các công cụ nhưng không thể có được nó để làm việc, tôi đoán tôi quá quen với C & bạn bè :) Làm thế nào tôi có thể nhận được điều này để làm việc?Truy cập phạm vi bên ngoài trong JavaScript

LinkInfoGrabber.prototype.toLinkInfo = function() { 
    var obj = null; 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      obj = new LinkInfo(raw); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 

    if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 
} 
+0

có thể điều kiện không được đáp ứng – Ibu

+0

Tôi đã nhìn thấy câu hỏi này một vài lần rồi. – ChaosPandion

+0

Giới hạn suy nghĩ của tôi hiện không hoạt động. Bạn có thể thêm hàm tạo LinkInfo không? – fncomp

Trả lời

3

Đó là vì các cuộc gọi AJAX không đồng bộ - chúng xảy ra vào một thời điểm khác với phần còn lại của ngữ cảnh.

Hãy thử cung cấp cho nó chức năng gọi lại (được gọi là gọi lại bên dưới).

LinkInfoGrabber.prototype.toLinkInfo = function(callback) { 
    $.ajax({ 
     url: this.getRequestUrl(), 
     success: function(raw) { 
      callback(new LinkInfo(raw)); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      obj = new LinkInfoException(jqXHR, textStatus, errorThrown); 
     }, 
     dataType: 'html' 
    }); 
} 

var l = new LinkInfoGrabber() 
l.toLinkInfo(console.log) //replace console.log with something meaningful 

Trong khi phương pháp này không cung cấp kết quả chính xác như có thể gọi mọi thứ nội tuyến, nó có lợi ích cho phép bản chất không đồng bộ của web.

+0

Thật vui khi tôi thực sự quên rằng ** JavaScript và XML không đồng bộ là không đồng bộ. Cuối cùng tôi đã chuyển cuộc gọi $ .ajax ra ngoài hàm đó và nó hoạt động tốt. Cảm ơn. –

0

Bạn đang trở obj trước khi cuộc gọi đến ajax lợi nhuận, vì vậy nó không được đặt để bất cứ điều gì nhưng null khi nó được trả về.

3

Mã này:

if (obj instanceof LinkInfo) { 
     return obj; 
    } else { 
     throw obj; 
    } 

chạy ngay sau khi bạn bắt đầu cuộc gọi ajax, nhưng obj không được thiết lập cho đến khi cuộc gọi ajax kết thúc thành công. Đây là một sự hiểu lầm phổ biến. Cuộc gọi Ajax là không đồng bộ. Cuộc gọi của bạn để $ .ajax() bắt đầu cuộc gọi không đồng bộ và sau đó phần còn lại của hàm của bạn ngay lập tức thực thi. Trình xử lý thành công chỉ được gọi khi cuộc gọi ajax thành công (một thời gian sau). Bạn không thể trả về obj từ chức năng của bạn. Bạn phải xử lý obj trong trình xử lý thành công của bạn và sau đó gọi thêm bất kỳ thứ gì muốn sử dụng nó từ trình xử lý thành công.

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