簡體   English   中英

單個承諾后的承諾循環

[英]loop of promises after a single promise

我只需要寫一個promise,然后在這個promise的結果下,創建一個電影數組,就必須在該數組中循環,並對每個元素進行一個遠程調用(也帶有promise)以裝飾其他數據。 我這樣嘗試:

var deferred = $q.defer();
var promises = [];

angular.forEach(tree, function(node) {
    promises.push(
        APICall.GetMovieList(node).then(function(success){
            var contents = {};
            //simple data manipulation
            return contents;
        })
        .then(function(contents){ /////////////////////// concatenation part that won't work
            angular.forEach(contents, function(content) {
                APICall.GetMovieDetails(content.ID).then(function(success){
                    content.metadata = success.metadata;    
                });
            });
            return contents;
        })
    );
});


$q.all(promises).then(ResolveFunction);

return deferred.promise;

出於可讀性考慮,我刪除了ResolveFunction,它僅管理promise數組並執行$ q.resolve(results)。 問題是,如果沒有串聯,它就像一個超級按鈕一樣工作,但是有了必要的串聯,它只會返回與以前相同的結果,由於異步調用將在之后調用,因此它的行為是這樣的……這是個好主意嗎?創建另一個deferred並在串聯部分中嵌套$ q.all並返回$ q.all解決的數組承諾? 非常感謝

您無需創建第二個deferred (根本不需要deferred )。
只需執行以下操作:

var promises = [];

angular.forEach(tree, function(node) {
    promises.push(
        APICall.GetMovieList(node).then(function(success){
            var contents = {};
            //simple data manipulation
            return contents;
        })
        .then(function(contents){ 
            var contentPromises = [];
            angular.forEach(contents, function(content) {
                contentPromises.push(
                    APICall.GetMovieDetails(content.ID).then(function(success){
                        content.metadata = success.metadata;    
                    })
                );
            });
            return $q.all(contentPromises).then(function() {
                return contents;
            });
        })
    );
});

return $q.all(promises).then(function(nodes) {
    return nodes;
});

這里是一個工作的jsfiddle,演示用嘲笑APICall -Factory。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM