2014-10-03 7 views
6

Haben Sie eine Frage zum Synchronisieren verschachtelter Versprechen, wenn Sie $ q in Angular verwenden. Wird der folgende Code sicherstellen, dass auf die gesamte Kette der Versprechen gewartet wird? Bedeutung werden die verschachtelten Aufrufe an Dienste, die Versprechen zurückgeben, im Block $ q.all erwartet?

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'); 
}); 

Grundsätzlich gilt: Gibt es eine Chance, mit dem aktuellen Code, der die dann von $ q.all wird, bevor alle verschachtelten Versprechen ausführen gelöst werden? Oder ist es rekursiv?

+1

Nein, ich glaube nicht. Die '$ q.all()' wartet auf 'call1',' call2' und 'call3', um zusammen zu lösen, bevor die' then() '-Funktion ausgelöst wird, aber die verschachtelten Async-Aufrufe von' call1' und 'call3' wird nicht gewartet. – Brett

+0

Ich hatte den Eindruck, dass es warten würde. –

+1

Ich habe kein eckiges env, um das im Moment zu testen, aber mit nativen Versprechungen wartet es definitiv. http://jsfiddle.net/p4evLjm6/ –

Antwort

4

Ja, es sieht so aus, als wäre Kevin korrekt. Ich habe auch einen schnellen Test in Winkel erstellt, um das Verhalten zu bestätigen.

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'); 
    }); 

}); 
Verwandte Themen