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

相關問題