2014-09-25 27 views
0

我是新來的這兩個承諾和無法理解什麼,我需要做的,代碼以下邏輯:承諾用於獲取和處理數組

我正在開發中的Node.js和Express中的Web服務來獲取歌曲來自wiki的數據並返回客戶端應用程序將使用的對象。維基的API不允許我編寫批量查詢;我必須單獨獲取每個頁面。所以我必須得到歌曲列表,然後爲每首歌曲執行一次呼叫。

我目前打算使用Node.js的Q中間件作爲我的承諾庫,儘管我願意爲更適合此任務的中間件提供建議。

這裏是我的僞代碼:

app.get('/songs/:criteria', function(request,response) { 
    downloadSongList() 
    .then(foreach(song) downloadSongData) 
    .then(assembleReturnValue) 
    .then(response.json(returnValue)); 
}); 

將實際的代碼是什麼樣的?

回答

3

的實際代碼將使用函數表達式,並foreach周圍,你會需要使用Q.all

app.get('/songs/:criteria', function(request,response) { 
    downloadSongList(request.params) 
    .then(function(list) { 
     var promises = list.map(function(song) { 
      return downloadSongData(song.params) // another promise 
     }); 
     return Q.all(promises); 
    }).then(function(allResults) { 
     // assemble 
     return // Value; 
    }).then(response.json); 
}); 

也看看these general rules的承諾發展。

+0

哪裏一.catch()適合在這裏捕獲錯誤? – 2014-09-25 20:56:19

+0

取決於你想要捕捉什麼樣的錯誤,以及是否打算從它恢復,但通常最終抓住所有錯誤。 – Bergi 2014-09-26 10:02:38

+0

我接受這個答案還爲時過早,因爲它無法正常工作。服務器不是在響應中返回JSON,而是坐在最後一步直到超時。我嘗試在鏈的末尾添加.done()。這是行不通的。 – 2014-09-26 11:15:18

0

這裏是藍鳥的替代解決方案,因爲你說你有興趣在不同的庫:我們使用什麼這裏

downloadSongList(request.params). 
       map(downloadSongData). 
       call("join",","). 
       then(response.json).catch(sendError) 

  • .map - 這需要承諾的數組,並在它們中的每一個上調用方法,我們會從downloadSongList返回的列表執行此操作。
  • .call它調用數組方法,在這裏我們要加入的元素爲字符串,不知道你使用的是什麼格式,在這裏,但這個基本上會做array.join

這些都是我們從藍鳥獲得的一些優點,除此之外,這與Bergi的答案非常相似。