2014-10-04 1 views
12

У меня есть службы данных, как это:Угловая TypeError: Не удается прочитать свойство «затем» неопределенной

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

Это называется в контроллере, чтобы инициализировать некоторые вещи:

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

И я получаю "TypeError: Невозможно прочитать свойство 'then' of undefined. Console.log (данные) в обратном вызове показывает ответ 200 «OK» и ожидаемые данные. Я уже искал эту ошибку, и в основном это связано с тем, что она не возвращает обещание в службе. Однако я возвращаю обещание. Устранение ошибки приводит к установке чего-либо в области контроллера в обратном вызове.

Угловая версия: AngularJS v1.3.0-РК-2

Спасибо!

+1

Можете ли вы опубликовать функцию обратного вызова? Также нет необходимости назначать вам вызов на переменную, это уже обещание, и вы могли бы просто позвонить. Затем на нем. –

+0

Не могли бы вы предоставить plunkr или больше контекста? Похоже, что этот код не должен выбрасывать TypeError. – Jon7

ответ

22

Вам не нужно возвращать обещание в этом случае, потому что вы используете обратный вызов. Обратные вызовы и обещания - это два конца спектра. Вы можете выполнить то, что хотите, просто с этим.

Если вы хотите использовать обратный вызов, вы можете оставить свой код контроллера.

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

Или, если вы хотите использовать обещания

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 для лучшего способа обработки обратного вызова. Я действительно обнаружил, что мое приложение включает в себя 'ngAnimate' из другой версии (v1.2.20). Я больше не нуждался в этом, поэтому я взял его и внезапно не стал больше ошибок типа. – DragonMoon

+0

У меня есть служба с вызовом '$ http' и' .then (function (res) {return res;}); 'и вызывать ее из контроллера, где у меня есть' serviceName.functionName(). Then (function (res) {// делаем что-то с res}) ', но я продолжаю получать' Can not read property 'then' of undefined', несмотря на то, что он работал до этого ... В чем причина? – user841760