我是两个承诺的新手,并且无法理解我需要做什么来编写以下逻辑:
我正在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));
});
实际代码是什么样的?
答案 0 :(得分: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的承诺开发。
答案 1 :(得分:0)
以下是Bluebird的替代解决方案,因为您说您对不同的库感兴趣:
downloadSongList(request.params).
map(downloadSongData).
call("join",",").
then(response.json).catch(sendError)
我们在这里使用的是:
.map
- 它接受一系列承诺,并在每一个上调用一个方法,我们为downloadSongList
返回的列表执行此操作。.call
调用数组方法,此处我们将元素作为字符串加入,不确定您在此处使用的格式,但这基本上会array.join
。 这些是我们从Bluebird获得的一些优势,除了这与Bergi的答案非常相似。