2014-10-03 14 views
6

कोणीय में $ q का उपयोग करते समय नेस्टेड वादों को सिंक्रनाइज़ करने के बारे में कोई प्रश्न पूछें। क्या निम्न कोड यह सुनिश्चित करेगा कि वादे की पूरी श्रृंखला का इंतजार है? मतलब उन सेवाओं को नेस्टेड कॉल करेगा जो वादे वापस करने के लिए $ q.all ब्लॉक में इंतजार कर रहे हैं?

var call1 = service1.get('/someUr').then(function(){ 
    return service2.get('/someUrl2'); //returns promise 
}); 

var call2 = service3.get('/someUr').then(function(){ 
    return 'hello'; 
}); 

var call3 = service4.get('/someUr').then(function(){ 
    return service3.get('/someUrl3');//returns promise 
}); 

$q.all(call1,call2,call3).then(function(){ 
    console.log('All asynch operations are now completed'); 
}); 

असल: वहाँ वर्तमान कोड के साथ एक मौका है कि तब $ q.all सभी नेस्टेड वादों से पहले निष्पादित करेंगे के हल कर रहे हैं है? या यह रिकर्सिव है?

+1

नहीं, मुझे ऐसा नहीं लगता है। '$ Q.all') '' '(' '' '' कॉल 1 ',' कॉल 2' और 'कॉल 3' के लिए 'तत्कालीन()' फ़ंक्शन को ट्रिगर करने से पहले एक साथ हल करने के लिए इंतजार करेगा, लेकिन नेस्टेड एसिंक कॉल 'कॉल 1' और 'कॉल 3' से लौटा दी गई है। पर इंतजार नहीं किया जाएगा। – Brett

+0

मैं इस धारणा के तहत था कि यह इंतजार करेगा। –

+1

मेरे पास इस समय परीक्षण करने के लिए एक कोणीय env आसान नहीं है, लेकिन मूल वादे के साथ, यह निश्चित रूप से प्रतीक्षा करता है। http://jsfiddle.net/p4evLjm6/ –

उत्तर

4

हां ऐसा लगता है जैसे केविन सही है। मैंने व्यवहार की पुष्टि करने के लिए कोणीय में एक त्वरित परीक्षण भी बनाया।

angular.module('myModule').controller('testController', function ($q,$scope) { 

    function promiseCall(data,timeout) { 
    var deferred = $q.defer(); 

    setTimeout(function() { 
     deferred.resolve(data); 
     console.log(data); 
    }, timeout); 

    return deferred.promise; 
    } 

    var a = promiseCall('call1 a',1000).then(function(){ 
    return promiseCall('call2 a',50); 
    }); 

    var b = promiseCall('call1 b',500); 

    var c = promiseCall('call1 c',1000).then(function(){ 
    return promiseCall('call2 c',50).then(function(){ 
     return promiseCall('call3 c',6000); 
    }); 
    }); 

    $q.all([a,b,c]).then(function(res){ 
    console.log('all calls are done'); 
    }); 

}); 
संबंधित मुद्दे