2014-10-20 59 views
-2

我是(正如我通常所要做的)與節點的異步本質搏鬥。節點在嵌套異步for循環完成後如何執行某些操作。

我的問題是我正在寫一個抓取腳本,根據這些數據獲取一些數據,獲取更多的數據,根據這些數據獲取更多的數據,然後基於這些做了一堆事情。我的問題是我想在所有這些流程都完成時做些事情,但我完全喪失了這種做法。

在一定範圍內。

(function() { 
    getData(function (things) { 
     things.forEach(function (thing) { 
      getOtherData(thing, function (otherThings) { 
       otherThings.forEach(function (otherThing) { 
        getSomeMoreData(thing, otherThing, function (anotherThings) { 
         anotherThings.forEach(function (anotherThing) { 
          getEvenMoreData(thing, otherThing, anotherThing, function (somethingElses) { 
           somethingElses.forEach(function (somethingElse) { 
            doSomething(somethingElse); 
           }); 
          }); 
         }); 
        }); 
       }); 
      }); 
     }); 
    }); 
}()); 

所以我想做一些事情,一旦整個過程完成。

有沒有人有任何建議如何做到這一點?

只需注意所有'get'或'do'方法都有IO。

+0

您將回調傳遞給原始函數,並用最終結果調用它。 – jfriend00 2014-10-20 01:36:46

+2

使用類似['async'](https://github.com/caolan/async)的流量控制庫來執行此操作並保持您的理智。 – JohnnyHK 2014-10-20 01:37:33

+0

@ jfriend00原始函數已經有回調。 getData已經有一個回調函數,它是循環到每個函數的函數。 – recneps 2014-10-20 01:41:46

回答

1

您可能會考慮使用模塊來幫助組織和改進代碼的佈局/可讀性,例如async。它包含常見任務的解決方案,例如異步迭代集合或執行並行或串行函數列表。

+0

關於異步庫的哪些方法可以使用,您有任何建議嗎?我研究了瀑布方法,但我不確定它是否可以用於循環。 – recneps 2014-10-20 02:23:19