javascript - 如何使用 Promise 实现这种类型的逻辑?

标签 javascript asynchronous bluebird

我对 Javascript Promise 的世界相当陌生,并且在实现以下内容时遇到问题:

var Promise = require('bluebird');
var jenkinsapi = require('jenkins-api');
var asyncJenkinsAPI = Promise.promisifyAll(jenkinsapi);
var jenkins = asyncJenkinsAPI.init("http://<user>:<password>@localhost:8080");

app.get('/api/servers', function(req, resp) {
    SavedJob.find({})
        .then(function(jobs) {
            return Promise.all(jobs.map(function(job){
                // do two calls with each job.name
                // build new data with the result of the two calls
                // return new data to next part of chain
                var job_status = jenkins.job_info(job.name, function(err, jobData) { return jobData; });
                var build_info = jenkins.last_build_info(job.name, function(err, buildData) { return buildData; });
                return {task_name: job_status.name,
                        status: STATUSMAP[job_status.color] || "UNKNOWN",
                        latest_build:
                            {
                                build_date: build_info.timestamp,
                                build_status: build_info.result,
                                build_number: build_info.number,
                                build_url: build_info.url
                            }
                        };
            }));
        })
        .then(function(results){
            console.log(results);
        });
    });

如何才能最好地实现在 Promise.all() 中对每个 job.name 进行两个异步调用,并在最后得到一组结果?

最佳答案

在使用 Promise Jenkins 之后,您将需要使用新的 Promise 返回方法:

var job_promise = jenkins.job_infoAsync(job.name);
var build_promise = jenkins.last_build_infoAsync(job.name);

(您可能希望将 {suffix: "_async"} 作为 option to promisifyAll 传递以获得更好的方法名称)。

然后合并这两个 Promise (Promise.all/Promise.props/Promise.join):

return Promise.join(job_promise, build_promise, function(job_status, build_info) {
    return {
        task_name: job_status.name,
        status: STATUSMAP[job_status.color] || "UNKNOWN",
        latest_build: {
            build_date: build_info.timestamp,
            build_status: build_info.result,
            build_number: build_info.number,
            build_url: build_info.url
        }
    };
});

其余代码(映射、链接)工作正常。

关于javascript - 如何使用 Promise 实现这种类型的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39020938/

相关文章:

javascript - 创建动态表单元素时没有 POST 数据

javascript - 将 JSON 数据打印到 innerHTML 中未定义 - [对象]

javascript - 如何在 react 异步调用后测试状态更新和组件重新渲染

node.js - 使用 bluebird 与 socket.io 不起作用

javascript - 未处理的拒绝错误 Bluebird

javascript - lodash/underscore.js 函数创建由 n 个 x 副本组成的数组

javascript - 巢JS : Auth guard flow

c# - 执行 client.SendAsync 时出现 HttpRequestException

multithreading - ZeroMQ:如何处理 ZeroMQ 节点中与消息无关的异步事件?

node.js - 被拒绝的 promise 没有达到目标