2014-10-03 166 views
6

在Angular中使用$ q時,有關於同步嵌套promise的問題。 以下代碼是否可以確保整個承諾鏈等待?含義是否會在$ 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'); 
}); 

基本上:在所有嵌套promise被解析之前,是否有可能使用當前代碼執行$ q.all的then?或者它是遞歸的?

+1

不,我不這麼認爲。在觸發'then()'函數之前''q.all()'會等待'call1','call2'和'call3'一起解析,但是從'call1'和'call3'返回的嵌套異步調用將不會等待。 – Brett 2014-10-03 18:34:11

+0

我的印象是它會等待。 – 2014-10-03 20:28:02

+1

我目前沒有一個角度測試的方便測試,但本機承諾,它肯定會等待。 http://jsfiddle.net/p4evLjm6/ – 2014-10-03 20:34:54

回答

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

});