2014-12-06 51 views
0

我有一個承諾鏈,負責初始化我的控制器。在此鏈條中,如果不符合某種條件,最好通過$state.go()將用戶發送到另一個州,並停止運行承諾鏈的其餘部分。這如何實現?

loadData1() .then(function(){ return loadData2(); }) .then(function(){ if (...) { $state.go(...); // how should the existing promise chain be killed off or stopped? } else { return loadData3(); } }) .then(function(){ return loadData4(); }) .then(function(){ console.log('controller initialized successfully'); }, function(error){ console.log('failed to initialize controller'); });

回答

1

而不是立即調用$state.go,拋出一個錯誤,並在年底的錯誤處理程序進行檢查。

loadData1() 
.then(function() { 
    return loadData2(); 
}) 
.then(function() { 
    if (exceptionalCondition) { 
    throw new Error('[MyCtrl:loadData2] Data failed to load!'); 
    } 
    return loadData3(); 
}) 
... 
.then(function() { 
    console.log('controller initialized successfully'); 
}, 
function (error) { 
    if (/^\[MyCtrl:loadData2\]/.test(error.message)) { 
    $state.go(redirect); 
    } else { 
    console.log('failed to initialize controller'); 
    } 
}); 

有關使用承諾的好處是,他們將處理錯誤,並立即如果發生終止鏈。