首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用承诺来实现这种逻辑?

如何使用承诺来实现这种逻辑?
EN

Stack Overflow用户
提问于 2016-08-18 14:32:41
回答 1查看 176关注 0票数 0

我对Javascript的承诺相当陌生,在实现以下方面时遇到了问题:

代码语言:javascript
复制
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进行两个异步调用,并在最后得到一组结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-18 16:20:04

在对jenkins进行了改进之后,您将需要使用新的允诺返回方法:

代码语言:javascript
复制
var job_promise = jenkins.job_infoAsync(job.name);
var build_promise = jenkins.last_build_infoAsync(job.name);

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

然后把这两个承诺结合起来,(Promise.all/Promise.props/Promise.join):

代码语言:javascript
复制
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
        }
    };
});

您的其余代码(映射、链接)运行良好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39020938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档