2014-11-24 50 views
1

我看過this函數。有人可以解釋這個遞歸函數MongooseJS

我可以看到它生成一個slu but,但我不太明白它是如何工作的。 在線327它返回來自Model.findOne函數的承諾,但在該函數的回調函數內,它們遞歸地再次調用從321行開始的外部函數。

任何人都可以幫助我嗎?我需要產生一些獨特的slu and,這似乎是一個解決方案 - 如果我能理解它。

回答

0

checkIfSlugExists函數在你的例子中確保沒有數據庫中已經存在slugToFind slug的文檔。

checkIfSlugExists不是簡單地檢查slu if是否空置,但它也有一些故障轉移機制。那麼,到底它返回一個承諾,一個空置的毛坯:

  1. 如果slugToFind在數據庫中不存在,那麼它的返回(線331)。
  2. 否則checkIfSlugExists檢查longSlug(行338-341),這只是原始slugToFind的較長版本。
  3. 如果兩個slugToFindlongSlug已經存在時,則開始checkIfSlugExists號碼添加到longSlug(線344-355)中,從2開始,直到它找到一個空的蛞蝓。

每一次checkIfSlugExists想要檢查一些新的slug它遞歸調用自己與這個新的價值。

+0

讓我困惑的事情主要是承諾內的遞歸函數調用。它在承諾的內部返回一個承諾......? – ptf 2014-11-24 15:44:58

+0

是的。當你用'.then'鏈接一個承諾時,所得到的承諾將被解析爲從'.then'回調返回的值。但是,當你從'.then'回調中返回一個承諾時,它首先得到解決。 – 2014-11-24 15:50:26

+0

因此,從第一個'checkIfSlugExists'調用返回的promise將使用遞歸鏈中返回的最後一個promise的值來解析。 – 2014-11-24 15:51:25

相關問題