2011-11-13 84 views
1

我有一組快遞/貓鼬嵌套查詢的,非常像這樣:節點JS,快遞,貓鼬,嵌套查詢

app.get(..., function(...) { 

    Schema1.query(..., function(..., res1) { 

     for (var key in res1) { 
      Schema2.query(..., function(..., res2) { 
      data[key].appendedAttribute = res2.somedata; 
      }); 
     } 

     res.render(..., data); 
    }); 

});

哪個不起作用,即,appendAttribute永遠不會附加到數據集。我究竟做錯了什麼?

+1

這不是如何異步編程工作 – Raynos

回答

2

使用after

app.get(..., function(...) { 
    Schema1.query(..., function(..., res1) { 
     var cb = after(Object.keys(res1).length, function() { 
      res.render(..., data);  
     }); 

     for (var key in res1) { 
      Schema2.query(..., function(..., res2) { 
       data[key].appendedAttribute = res2.somedata; 
       cb(); 
      }); 
     } 
    }); 
}); 

基本上第二個查詢完成後,你必須只火res.render電話。

+0

老兄,你搖滾! – Gunnar2k

+0

不是你想在所有的查詢得到執行後調用cb()。? (因此只有一次) – alessioalex

+0

@alessioalex'cb'必須調用'n'次。在它繼續之前。 n是「後」的第一個參數。即他所做的Schema2查詢量。 – Raynos

0

使用Step

app.get(..., function(...) { 
    var data; 
    Step(
    function first_query() { 
     Schema1.query(...,this); 
    }, 
    function multiple_queries(err, res1) { 
     for (var key in res1) { 
     Schema2.query(..., function(..., res2) { 
      data[key].appendedAttribute = res2.somedata; 
      this.parallel(); // make sure callback gets executed only after all the queries are executed 
     }); 
     }  
    }, 
    function render() { 
     res.render(..., data); 
    } 
); 
});