2014-09-25 19 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的答案非常相似。