获取和处理数组的承诺

时间:2014-09-25 15:43:27

标签: javascript node.js promise q

我是两个承诺的新手,并且无法理解我需要做什么来编写以下逻辑:

我正在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));
});

实际代码是什么样的?

2 个答案:

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