2014-12-02 109 views
0

我正在開發一個系統,以將有FreeUnit的志願者(免費的時間段)與WorkUnits(需要X個志願者的次數的時間段)相匹配。以異步代碼排序

我希望實現的算法是通過可能的FreeUnits(WorkUnit.time == FreeUnit.time)升序對WorkUnits進行排序,並按順序將它們與FreeUnits匹配 - 我想填充最難填充的WorkUnits。

爲了實現這一點,我的WorkUnit模型有方法possibleFreeUnit,它返回可用於此WorkUnit的FreeUnit列表。

possibleFreeUnit: function(next) { 

    var freeUnits = Array(); 
    FreeUnit.find() 
    .populate("owner") 
    .where({slot: this.slot}) 
    .exec(function(err, units){ 

     next(units); 
    }); 
} 

我使用可能FreeUnits的#我的排序功能,它通過可能FreeUnits上升的的訂單任務包。

WorkUnit.find() 
    .populate("owner") 
    .then(function(workunits) { 
    sails.log("before sort"); 

    workunits.sort(function(a, b){ 

     a.possibleFreeUnit(function (aFreeUnits){ 
     b.possibleFreeUnit(function (bFreeUnits){ 
      sails.log(a.toString() + ": " + aFreeUnits.length + 
      " vs " + b.toString() + ": " + bFreeUnits.length); 
      return aFreeUnits.length - bFreeUnits.length; 
     }); 
     }); 
    }); 

    workunits.forEach(function(workunit){ 

     sails.log(workunit.toString()); 
     //this code should iterate over them in # possibleFreeUnits ascending 
    }); 

    }); 

問題是在遍歷每個工作單元之後運行排序,因爲我的排序函數是異步的。

克服這個問題的最好方法是什麼?我曾嘗試使用setTimeout,但即使延遲後,工作單元也未顯示排序。我想知道這是否是一個很好的承諾用例。非常感謝!

+0

是不是你的'.sort('回調信號表明它已完成? – 2014-12-02 02:35:35

回答

0

Humm。你的排序是真正的異步還是它只是一個函數作爲參數?另外,我認爲我們需要更多關於workunit.sort方法的信息。

無論如何,作爲一個高層次,你可以使用類似async這樣的模塊來等待異步任務的完成呢?

+0

使用異步模塊幫助我完成了我想要完成的任務,謝謝! – kmangutov 2014-12-05 00:13:23