2016-12-21 49 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

相关问题