2016-12-21 9 views
0

Код на который наследуется. Я упростил все, что мог, чтобы задать вопрос.Невозможно прочитать свойство 'then' неопределенного с вложенными вызовами функций

У меня есть простой угловой сервис, который делает API вызова и возвращает результаты:

doWork = function(reqId) { 
    return $http.get('/api/dowork/' + reqId).then(function(response) { 
    return response.data; 
    }).catch(function(response) { 
    return $q.reject(response.data); 
    }); 
} 

mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return this.doWork(req); 
} 

В мой контроллер, я могу вызвать функцию DoWork на службе и получить обратно хороший ответ, как это:

myService.doWork('simple').then(function(response){ 
    //do something great with response 
}); 

Однако, если мне нужно вызвать промежуточный метод предварительной обработки запроса, я получаю «не удается прочитать свойство„ затем“неопределенных»:

myService.mediumRequest().then(function(response){ 
    //do something great with response 
}); 

Почему функция mediumRequest не возвращает обещанное doWork?

+0

Как насчет 'return this.doWork (req)' ?? –

+1

Можете ли вы привести минимальный воспроизводимый пример, который не требует вызовов API? –

+0

Я отредактировал свой пример кода, чтобы включить «this.doWork (req)», так как это закодировано мой фактический сервис. @LeonardoChaia Этот код не работает. –

ответ

1

Попробуйте этот код, вы сделали неправильно в службе

var app = angular.module("myApp", []) 
.service('myService',function($http,$q){ 
    this.doWork = function(reqId) { 
    return $http.get('/api/dowork/'+ reqId).then(function(response) { 
     return response.data; 
    }).catch(function(response) { 
     return $q.reject(response.data); 
    }); 
    }; 

    this.mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return this.doWork(req); 
    }; 
}) 

app.controller("myCtrl", function($scope,$compile,myService) { 
    myService.doWork('simple').then(function(response){ 
    console.log('b',response) 
    }); 
    myService.mediumRequest().then(function(response){ 
    console.log('a',response) 
    }); 
}) 

Он будет работать

+0

Я бы удалил неиспользуемый код 'catch' .. –

-2

Вы можете попробовать то, что вы хотите с помощью $ Q услуги:

var doWork = function(reqId) { 
    var result = $q.defer(); 
    $http.get('/api/dowork/' + reqId).then(function(response) { 
     result.resolve(response.data); 
    }).catch(function(response) { 
     result.reject(response); 
    }); 
    return result; 
}; 

this.doWork = doWork; 

this.mediumRequest = function() { 
    var req = 'medium';//normally do something hard to derive this value 
    return doWork(req); 
}; 
0

Как и большинство В этом случае проблема была ошибкой кодирования в моем фактическом сервисном коде. Код, который я представил в этом вопросе, будет работать так, как ожидалось. Я ценю пару людей, которые предложили способы определения проблемы. Вот мой вопрос:

Моей фактическая «промежуточная» функция имела такую ​​структуру:

mediumRequest = function(options) { 
    //process first option meeting criteria 
    options.forEach(function (item) { 
     if(item.meetsCriteria) 
     { 
     var req = item.code; 
     return this.doWork(req); 
     } 
    }); 
} 

Как вы можете видеть, возвращение на самом деле просто выходящее из Foreach и никогда не возвращаемый из функции mediumRequest. Отсюда и ошибка.

+0

, так как я предположил, что ваш' this' тоже был неправильным. – Alnitak