【问题标题】:Promises for getting and processing an array获取和处理数组的 Promise
【发布时间】:2014-09-26 01:35:47
【问题描述】:

我对这两个 Promise 都不熟悉,并且无法理解我需要做什么来编写以下逻辑:

我正在使用 Node.js 和 Express 开发 Web 服务,以从 wiki 获取歌曲数据并返回一个对象,客户端应用程序将使用该对象。 wiki 的 API 不允许我编写批处理查询;我必须单独获取每一页。所以我必须获取歌曲列表,然后为每首歌曲执行调用。

我目前打算使用 Node.js 的 Q 中间件作为我的 Promise 库,但我愿意接受有关更适合此任务的中间件的建议。

这是我的伪代码:

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

实际的代码是什么样的?

【问题讨论】:

    标签: javascript node.js promise q


    【解决方案1】:

    实际代码将使用函数表达式,而在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 以了解承诺发展。

    【讨论】:

    • .catch() 在这里适合捕获错误吗?
    • 取决于您要捕获的错误以及您是否打算从中恢复,但通常最终捕获所有错误。
    • 我接受这个答案还为时过早,因为它不能正常工作。服务器不会在响应中返回 JSON,而是停留在最后一步,直到超时。我尝试在链的末尾添加 .done() ;这行不通。
    • 在最后添加另一个.catch(console.log) 看看有什么问题。我的猜测是 .json() 确实需要作为方法调用,请尝试使用 .then(response.json.bind(response)) 或函数表达式。如果这不是问题,您可能仍然应该接受这个答案和ask a new question,您将在其中发布您当前的实际代码。
    【解决方案2】:

    这是 Bluebird 的替代解决方案,因为您说您对不同的库感兴趣:

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

    我们在这里使用的东西:

    • .map - 它接受一组承诺,并在每个承诺上调用一个方法,我们对从 downloadSongList 返回的列表执行此操作。
    • .call 调用数组方法,在这里我们将元素作为字符串连接,不确定您在这里使用什么格式,但这基本上可以做到array.join

    这些是我们从 Bluebird 获得的一些优势,除了这与 Bergi 的回答非常相似。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多