我对这两个承诺都是新手,很难理解我需要做什么来编码以下逻辑:
我正在Node.js和Express中开发一个Web服务,从wiki中获取歌曲数据并返回一个对象,客户端应用程序将使用该对象。维基的API不允许我编写批处理查询;我必须单独获取每一页。所以我必须得到歌曲列表,然后为每首歌打电话。
我目前打算使用Node.js的Q中间件作为我的promise库,尽管我愿意接受关于更适合此任务的中间件的建议。
这是我的伪代码:
app.get('/songs/:criteria', function(request,response) {
downloadSongList()
.then(foreach(song) downloadSongData)
.then(assembleReturnValue)
.then(response.json(returnValue));
});
实际的代码会是什么样子?
实际的代码将使用函数表达式,并且在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);
});
还可以看看这些关于promise开发的一般规则。
这是Bluebird的另一个解决方案,因为您说过您对不同的库感兴趣:
downloadSongList(request.params).
map(downloadSongData).
call("join",",").
then(response.json).catch(sendError)
我们在这里使用的:
.map
-它接受一个promise数组,并在每个promise上调用一个方法,我们对downloadSongList
返回的列表执行此操作- 调用数组方法的
.call
,在这里我们将元素连接为字符串,不确定您在这里使用的是什么格式,但这基本上可以实现array.join
这些是我们从蓝鸟身上获得的一些优势,除了这与Bergi的回答非常相似。