2016-07-29 106 views
4

我面臨着使用$q#all方法返回承諾的問題。按順序退回承諾

我要做出承諾,互相依賴,

如果我設置obj1, obj2 and obj3我想,讓他們在同一順序

我該如何做到這一點?

Factory:

mainFactory.$inject = ['$http', '$q']; 

function mainFactory($http, $q) { 
    var mainFactory = { 
    getPromises: getPromises 
    }; 

    return mainFactory; 

    function getPromises(id) { 
    promises = { 
     'obj1': $http.get('http1'), 
     'obj2': $http.get('http2'), 
     'obj3': $http.get('http3'), 
     'obj4': $http.get('http4', { params: { 'id': id } }), 
     'obj5': $http.get('http5'), 
     'obj6': $http.get('http6', { params: { 'id': id } }) 
    }; 

    return $q.all(promises); 
    } 
} 

Controller:

MainCtrl.$inject = ['mainFactory']; 

function MainCtrl(mainFactory) { 
    var vm = this; 
    mainFactory.getPromises(id) 
    .then(getResponse) 
    .catch(getError); 

    function getResponse(response) { 
    var keys = Object.keys(response), i = keys.length; 
    while (i--) { 
     var key = keys[i]; 
     console.log(key); // I want all the keys in order, i.e. => obj1, obj2.. and so on 
     var value = response[key].data; 
     switch(key) { 
     ... 
     } 
    } 
    } 

    function getError(error) { 
    console.log(error); 
    } 
} 

編輯:

我也試過這樣:

var promises = {}; 
return $http.get('/admin/http1.json').then(function (value) { 
    promises['obj1'] = value; 
    }) 
.then(function (result) { 
    return $http.get('/admin/http2.json').then(function (value) { 
    promises['obj2'] = value; 
    }); 
}).then(function (result) { 
    return $http.get('/admin/http3.json').then(function (value) { 
    promises['obj3'] = value; 
    }); 
});  
return $q.all(promises); 
+1

我不擅長承諾,對不起,但另一種方法是使用http://caolan.github.io/async/docs.html#.eachOfSeries – Plato

+6

對象鍵天生*無序*。改用數組。 –

+0

看看$ q.serial()上的這篇文章。我認爲這將是你正在尋找的。 http://www.codeducky.org/q-serial/ – mhodges

回答

1

編輯2

錯誤,我只是複製你的代碼上面沒有意識到這是一個對象。大聲笑。

promises = [ 
    $http.get('http1'), 
    $http.get('http2'), 
    $http.get('http3'), 
    $http.get('http4', { params: { 'id': id } }), 
    $http.get('http5'), 
    $http.get('http6', { params: { 'id': id } }) 
] 

編輯1

對不起,我沒有注意到的評論Jared Smith是寫。

Object keys are inherently unordered. Use an array instead.

編輯0

對象鍵不會被訂購。使用數組聲明您的承諾。

promises = [ 
    $http.get('http1'), 
    $http.get('http2'), 
    $http.get('http3'), 
    $http.get('http4', { params: { 'id': id } }), 
    $http.get('http5'), 
    $http.get('http6', { params: { 'id': id } }) 
] 

$q.all(promises) 
    .then(functions(resolves){ 
     // resolves here is an array 
    }).catch(function(err){ 
     // throw err 
    }); 
+0

'未捕獲的SyntaxError:意外的標記:'。不知道這是否應該是一個對象...但它絕對是無效的JavaScript。 –

+0

嗯,誠實的錯誤@PatrickRoberts請閱讀**編輯2 ** – CENT1PEDE

1

使用$q.all將解決在沒有特定的順序每個承諾。如果您希望在每個承諾解決後執行它們,請使用承諾鏈接

function getPromises(id) { 
    var getObjA = function() { 
    return $http.get('http1'); 
    }; 

    var getObjB = function() { 
    return $http.get('http2'); 
    }; 

    var getObjC = function() { 
    return $http.get('http3'); 
    }; 

    var getObjD = function() { 
    return $http.get('http4', { params: { 'id': id } }); 
    }; 

    var getObjE = function() { 
    return $http.get('http5'); 
    }; 

    var getObjF = function() { 
    return $http.get('http5', { params: { 'id': id } }); 
    }; 

    return getObjA() 
    .then(getObjB) 
    .then(getObjC) 
    .then(getObjD) 
    .then(getObjE) 
    .then(getObjF); 
} 

編輯:作爲一個額外的信息,您可以通過放置一個catch語句這裏

getPromises("id") 
    .then(<success callback here>) 
    .catch(<error callback that will catch error on any of the promises>); 

意義趕在該等承諾的任何錯誤,一旦承諾失敗,所有下方止跌隨後承諾將不會被執行,並會被你的捕獲聲明捕獲