2015-07-30 25 views
5

मैं उलझन में हूं कि मुझे इस सेवा कॉल को आवश्यकतानुसार क्यों नहीं किया जा सकता है। console.log के भीतर definitionsService.get वादा संकल्प है जो मैं अपेक्षा करता हूं (जिस वस्तु को मैं वापस करने का लक्ष्य रख रहा हूं)। हालांकि console.logdefs वापस आने से ठीक पहले undefined है, जिसका अर्थ है कि मेरा लौटा मूल्य अपरिभाषित है। मैं क्या खो रहा हूँ? नीचे दिए गए जवाब के अनुसारकोणीय सेवा कॉल के भीतर स्कॉइंग

function getDefinitions() { 
    var defs = $q.defer(); 
    definitionsService.get().$promise.then(function(data) { 
    defs.resovle(data); 
    }); 
    return defs.promise; 
}; 

:

function getDefinitions() { 
    var defs; 
    definitionsService.get().$promise.then(function(data) { 
    console.log(data); 
    defs = data; 
    console.log(defs); 
    }); 
    console.log(defs); 
    return defs; 
}; 

मैं करने के लिए ऊपर बदल दिया है।

function detail(account) { 
    getDefinitions().then(function(definitions) { 
    var key = angular.isDefined(definitions.ABC[account.code]) ? account.code : '-'; 
    return definitions.ABC[key].detail; 
    }); 
} 

तब मेरे नियंत्रक में मैं निम्न कार्य करने की कोशिश कर रहा हूँ:

var getAccounts = function() { 
    playersService.getAccounts({ 
    playerId: playerId 
    }).$promise.then(function(accounts) { 
    for (var i = 0; i < accounts.length; i++) { 
     accounts[i].detail = utilitiesService.detail(accounts[i]); 
    } 
    vm.accounts = accounts; 
    }); 
}; 

var init = function() { 
    getAccounts(); 
}; 

init(); 

मेरे समस्या है

मैं भी जिस तरह से मैं इस तरह एक ही जवाब प्रति इस विधि कॉल बदल accounts[i].detail लगातार undefined है।

उत्तर

2

असीमित कॉल की दुनिया में आपका स्वागत है।

यदि आप getDefinitions (definitonsService से) के अंदर एसिंक कॉल कर रहे हैं, तो आपको यह समझना होगा कि getDefinitions() async भी है। जिसका मतलब है कि आप बस defs वापस नहीं कर सकते हैं।

जब आप इसे वापस करने से पहले डीफ़ प्रिंट करते हैं, तो सेवा का एसिंक कॉल अभी तक नहीं किया गया है।

defs भी एक वादा वस्तु होना चाहिए। फिर आप यह लौट सकते हैं के रूप में आप करते हैं, लेकिन विधि यह लागू भी तो फिर (समारोह (defs) के साथ इसका इस्तेमाल करना चाहिए ...

या कोड के रूप में:

function getDefinitions() { 
    var defs = $q.defer(); 
    definitionsService.get().$promise.then(function(data) { 
    defs.resovle(data); 
    }); 
    return defs.promise; 
}; 

और जो कोई भी कॉल getDefinitions(): संपादन के बाद सवाल का

getDefinitions().then(function(defs) { 
// do something with defs... 
} 

उत्तर:

समस्या

जी अंदर async प्रकृति के साथ एक बार फिर से है etAccounts विधि। utilitiesService.detail एक async विधि है। तो आप वास्तव में खातों के लिए वादे, मूल्य नहीं, असाइन कर रहे हैं [i] .detail।

चूंकि प्रत्येक खाते में एक async कॉल आवश्यक होगा, का उपयोग कर $ q.all एक अच्छा विचार की तरह लगता है:

var promises = []; 
for (var i = 0; i < accounts.length; i++) { 
     promises.push(utilitiesService.detail(accounts[i])); 
    } 
$q.all(promises).then(function(values)){ 
// you should have all the account details inside 'values' and can update vm.accounts 
} 

याद - वादा हो रही तुल्यकालिक है। वादा प्राप्त करना कि वादा ... अच्छा, आपको प्राप्त करने का वादा करता है - यह असीमित है।

+0

कि काफी मददगार था। मेरी एकमात्र शेष समस्या यह है कि जब मैं उस विधि को कॉल करता हूं जो मेरे नियंत्रक से 'getDefinitions' कहता है, तो यह भी एक वादा वापस कर रहा है। – MattDionis

+0

ठीक है, असीमित प्रकृति पूरे कॉल स्टैक में उलझ जाएगी। क्या आप स्पष्टता के लिए अतिरिक्त कोड प्रदान कर सकते हैं? –

+0

मेरे मूल प्रश्न में जोड़ा गया विवरण। – MattDionis

0

समस्या यह है कि आप वापस वादे के हल होने से पहले लौट रहे हैं, जबकि defs === None

आप अपने कोड थोड़ा बदल कर इस का समाधान कर सकते हैं:

function getDefinitions() { 
    return definitionsService.get().$promise.then(function(data) { 
    return data; 
    }); 
}; 
संबंधित मुद्दे