2014-10-04 20 views
12

Tôi có một dịch vụ dữ liệu như thế này:TypeError góc: không thể đọc thuộc tính 'sau đó' không xác định

this.myFunction= function(callback) { 
    var url = rootURL + "path1/path2/service.json"; 
    var promise = $http.get(url); 
    promise.then(function(payload){ 
     return callback(payload); 
    }); 
    return promise; 
} 

Nó được gọi là trong một bộ điều khiển để khởi tạo một số nội dung:

DataService.myFunction(function(data) { 
    if(data.statusText !== "OK"){ 
     $scope.$worked= false; 
    }else{ 
     $scope.$worked= true;    
    } 
} 

Và tôi nhận được "TypeError: Không thể đọc thuộc tính 'rồi' không xác định". Console.log (dữ liệu) trong cuộc gọi lại hiển thị phản hồi 200 "OK" và dữ liệu tôi mong đợi. Tôi đã tìm kiếm lỗi này và chủ yếu là do không trả lại lời hứa trong dịch vụ. Tuy nhiên, tôi đang trả lời lời hứa. Thiết lập bất cứ điều gì trên phạm vi điều khiển trong gọi lại gây ra lỗi.

Phiên bản góc: AngularJS v1.3.0-rc.2

Cảm ơn!

+1

Bạn có thể gửi các hàm callback? Ngoài ra không cần phải chỉ định bạn nhận được cuộc gọi đến một biến nó đã là một lời hứa và bạn chỉ có thể gọi .then vào nó. –

+0

Bạn có thể cung cấp ngữ cảnh nhiều hơn hay không? Có vẻ như mã đó không nên ném TypeError đó. – Jon7

Trả lời

22

Bạn không cần trả lại lời hứa trong trường hợp này, vì bạn đang sử dụng gọi lại. Callbacks và hứa hẹn là hai đầu của quang phổ. Bạn có thể thực hiện những gì bạn muốn đơn giản với điều này.

Nếu bạn muốn sử dụng gọi lại, bạn có thể để lại mã điều khiển của mình.

this.myFunction= function(callback) { 
    var url = rootURL + "path1/path2/service.json"; 
    $http.get(url).then(function(response) { 
     callback(response.data); 
    }); 
} 

Hoặc nếu bạn muốn sử dụng những lời hứa

this.myFunction= function() { 
    var url = rootURL + "path1/path2/service.json"; 
    return $http.get(url).then(function(response) { 
     return response.data; 
    }); 
} 

DataService.myFunction().then(function(data) { 
    if(data.statusText !== "OK"){ 
     $scope.$worked = false; 
    } else { 
     $scope.$worked = true;    
    } 
}); 
+2

+1 để có cách tốt hơn để xử lý cuộc gọi lại. Tôi thực sự thấy rằng ứng dụng của tôi đã bao gồm 'ngAnimate' từ phiên bản khác (v1.2.20). Tôi không còn cần nó nữa nên tôi lấy nó ra và tất cả các loại lỗi đột ngột. – DragonMoon

+0

Tôi có một dịch vụ với một cuộc gọi '$ http' và' .then (function (res) {return res;}); 'và gọi nó từ một controller nơi tôi có' serviceName.functionName().) {// làm một cái gì đó với res}) ', nhưng tôi tiếp tục nhận được' Không thể đọc tài sản 'sau đó' của undefined' mặc dù nó đã làm việc trước ... Điều gì có thể là lý do? – user841760

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