2014-01-18 24 views
0

我有一個數組我想要迭代,並根據其長度進行異步調用以獲取我想要添加到新數組的一些數據。對異步調用使用迭代和遞歸

的僞代碼看起來像:

var path =["Cars", "Owners", "Name"]; 
var parentObject = mainObject; 

getChildren (path, parentObject){ 
    var deferred = new JQuery.Deferred(); 
    var pathSplit = path.split("."); 
    var nestedObjectName = pathSplit[0]; 
    var childrenIds = new Array(); 
    if (pathSplit.length = 2){ 
     return deferred.resolve(parentObject.Id); 
    } 
    else{ 
     nestedObject = parentObject[nestedObjectName]; 
     pathSplit.shift(); 
     var promises = []; 
     for (child in nestedObjects.children){      //iteration 
      promises.push(
       asyncCalltoGetDetails(child).then{ //After this line, the promises array resolves. !?!?! 
        getChildren(pathSplit, child).then(function(childId){ //recursivity 
         childrenIds.push(childId); 
        });  
       }   
      ); 
     } 
     JQuery.when.apply(null, promises).then(function(){ 
      return deferred.resolve(childrenIds); 
     }); 
    } 
    return deferred.promise(); 
} 

當我使用一個異步調用我使用的承諾作出一個迭代[]作爲解釋在這裏:How do you work with an array of jQuery Deferreds?

而當我用使用異步方法遞歸調用我使用了一個延期的對象通過所有的方式。正如在這裏解釋的:AngularJS, promise with recursive function

我遇到的問題是,承諾解決了asyncCalltoGetDetails時,但我想解決它,當遞歸getChildren返回deferred.resolve();

任何想法我做錯了什麼?如何正確使用promises []技術和延遲對象在同一個方法中迭代?

謝謝你的時間!

+0

'var path = {「Cars」,「Owners」,「Name」};'這不是一個有效的對象 –

+0

@ A.Wolff。更新。只是僞代碼來sumarize我的實際代碼。 –

+0

很難弄清楚你在這裏做什麼,但是你有沒有嘗試在'getChildren()'方法之外設置數組''promise'?在這裏,每次你調用getChildren()時,'promises'都是一個新數組。 –

回答

1

我遇到的問題是承諾解決了asyncCalltoGetDetails時,但我想解決它,當遞歸getChildren返回deferred.resolve();

你在濫用deferred一點,但它應該工作。如果承諾在asyncCalltoGetDetails已完成其工作之前解決,則需要搜索該功能中的錯誤。

任何想法我做錯了什麼?

這可能是唯一的僞代碼,但是這看起來馬車:

promises.push(
    asyncCalltoGetDetails(child).then{ //After this line, the promises array resolves. !?!?! 
     getChildren(pathSplit, child).then(function(childId){ //recursivity 
      childrenIds.push(childId); 
     });  
    }   
); 

then確實希望的功能,所以我想你給它一個函數表達式。哪一行你的意思呢 - then執行,但不是它的回調,回調執行,但不等待getChildren

對於後者,解決方案是,當用於動作鏈接(將承諾和回調組合爲新承諾)允許您從回調中返回承諾時。這就是缺少的 - return聲明!如果您只撥打getChildren,其結果將永遠不會在任何地方使用,回撥只會返回undefined


此外,對於正常使用的承諾,這是醜陋的:使用 「幫手」 陣列childrenIds(從異步回調)

JQuery.when.apply(null, promises).then(function(){ 
     return deferred.resolve(childrenIds); 
    }); 
} 
return deferred.promise(); 

停止!手動停止創建deferred - 你甚至不會拒絕它!取而代之的是,使孩子的ID爲結果值的承諾,並使用您的回調參數只有

查看我對Understanding promises in node.js for recursive functionIs there an example of using raw Q promise library with node to recursively traverse a directory asynchronously?的回答 - 即使他們沒有使用jQuery的實現,他們應該給你一個如何去做的想法。