2015-05-14 83 views
0

有3個功能第一個是我的承諾。如何在返回數據之前等待所有承諾解決?

fnGetIps : function() { 
     return new Promise(function(resolve, reject) { 
      var err = [], path = getBaseUrl(); 
      restGet(path + NAMES, function (res, edges) { 
      if (res === undefined) { 
       reject("Unable to get data"); 
      } else { 
       resolve(edges); 
     } 
    }); 
    }); 
}, 

第二個是我用我的承諾。

fnGetData: function(obj){ 
var promise_holder; 
for (property in obj) { 
if (obj.hasOwnProperty(property)) { 
    if(condition){ 
    promise_holder = fngetip(); 
    } 
if(condition2){ 
    //some other code 
    } 
    } 
} 
promise_holder.then(function (ifChildren) { 
        obj.children = ifChildren; 
       }, function (err) { 
        console.error(err); 
       }); 
       } 

最後在那裏我打電話fnGetData

TopoTree : function(children) { 
var treeArray; 
for (i = 0; i < children[i]; i++) { 
     fnGetData(children[i]); 
      } 

         treeArray.push(treeData); 
         return treeArray; 
        }, 

我不想返回TreeArray所有的承諾都解決的fnGetData前一個功能。

如何等待所有承諾先解決然後返回數據?

我不能使用promise.All,因爲我沒有promise_holdertopotree範圍或我在錯誤的方向思考?

+0

你應該重新考慮您的變量名。他們很混亂。 (http://www.makinggoodsoftware.com/2009/05/04/71-tips-for-naming-variables/) – Sukima

+0

他們是sudo的名字。 –

回答

1

你想要Promise.all()

有無fnGetData返回promise_holder並有TopoTree收集他們在一個數組並把完成邏輯在隨後的功能後Promise.all()

fnGetData: function(obj){ 
    var promise_holder; 
    for (property in obj) { 
    if (obj.hasOwnProperty(property)) { 
     if(condition){ 
     promise_holder = fngetip(); 
     } 
     if(condition2){ 
     //some other code 
     } 
    } 
    } 

    // RETURN THE PROMISE HERE! 
    return promise_holder.then(function (ifChildren) { 
    obj.children = ifChildren; 
    // Return a value for use later: 
    return ifChildren; 
    }); 
} 

TopoTree : function(children) { 
    var promises = []; 
    for (i = 0; i < children.length; i++) { 
    promises.push(fnGetData(children[i])); 
    } 

    // We are handling the result/rejections here so no need to return the 
    // promise. 
    Promise.all(promises) 
    .then(function(treeArray) { 
     // Do something with treeArray 
    }) 
    .catch(function(error) { 
     console.log(error); 
    }); 
}, 
+0

它說然後undefined Promise.all –

+0

這個錯誤是準確的 「TypeError:無法調用方法」,然後'未定義' –

+0

'.all()'返回一個承諾,解決所有可迭代的promise已解決,所以你應該能夠'.then()'。你在使用任何特定的承諾庫嗎? –

相關問題