2015-10-05 34 views
0

我目前正在嘗試編寫一個角度服務來處理第三方API。 API對象處理一切。你只需創建對象,調用它的一個函數,並獲得一個有效載荷。當我通過服務功能的調試步驟,我可以看到findRole函數內部JSON響應,但隨後就出現了錯誤:Angular - 工廠應該從第三方回調中返回值

TypeError: Cannot read property 'then' of undefined 

如何使這項工作任何想法?

模塊

var angular = require('angular'), 
    govtracksvc = require('./rep.service'), 
    Rep = require('./Rep'), 
    govtrack = require('govtrack-node'); 

angular.module('RepresentativeApp', []) 
    .value('govtrack', govtrack) 
    .factory('govtracksvc', govtracksvc) 
    .controller('Rep', Rep); 

module.exports = angular.module('RepresentativeApp'); 

控制器

module.exports = function Rep (govtracksvc) { 
    var rep = this; 
    rep.list = govtracksvc.findRole(rep.govtrack); 
}; 

服務

module.exports = function govtracksvc(govtrack) { 
    var rep = this; 
    var data = {}; 
    govtrack.findRole({current: true}, function (err, res) { 
     if (err) { 
      console.log('err: ', err); 
     } 
     return res; 
    }).then(function (res) { 
     data = res.objects; 
    }); 
    return data; 
}; 

這裏是終點,應該有人想看到的數據:https://www.govtrack.us/api/v2/role/?current=true

+0

你能分享govtrack.findRole實施。問題可能在 – jsNovice

+0

@iLoveJS它是第三方代碼,正如我所提到的,我可以在調試器中看到響應。如果我在響應.then()行之前檢查響應,則該包是可見的。 – Kraken

+0

@iLoveJS萬一這有助於:https://www.npmjs.com/package/govtrack-node – Kraken

回答

0

這裏是使用回調的代碼示例,看看它是否適合你的需要:
模塊

var angular = require('angular'), 
govtracksvc = require('./rep.service'), 
Rep = require('./Rep'), 
govtrack = require('govtrack-node'); 

angular.module('RepresentativeApp', []) 
    .value('govtrack', govtrack) 
    .factory('govtracksvc', govtracksvc) 
    .controller('Rep', Rep); 

module.exports = angular.module('RepresentativeApp'); 

控制器

module.exports = function Rep (govtracksvc, $scope) { 
    var rep = this; 
    govtracksvc.findRole(rep.govtrack, function(result){ 
     rep.list = result; 
     if(!$scope.$$phase){ 
      $scope.$apply(); 
     } 
    }); 
}; 

服務

module.exports = function govtracksvc(govtrack, callback) { 
var rep = this; 
govtrack.findRole({current: true}, function (err, res) { 
    if (err) { 
     console.log('err: ', err); 
     return {}; 
     } 
    return res.objects; 
    }); 
}; 
+0

這是什麼?如果(!$ scope。$$階段){$ scope。$ apply(); } – Kraken

+0

有時,在進行異步調用時,角度範圍應用/刷新不會發生,因此在這種情況下,此代碼會爲您手動執行此操作,以便在UI中獲得即時效果。這是一個關於這個着名的博客:http://ruoyusun.com/2013/05/25/things-i-wish-i-were-told-about-angular-js.html – jsNovice

+0

我去了$ q,但我因爲你的回答鋪平了道路,所以你可以給你答案。 – Kraken