我如何使用 Promises 实现这种类型的逻辑?
How can I implement this type of logic using Promises?
我对 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
进行两次异步调用并在最后得到一组结果?
在 promified 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.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 承诺的世界还很陌生,在执行以下内容时遇到问题:
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
进行两次异步调用并在最后得到一组结果?
在 promified 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.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
}
};
});
您的其余代码(映射、链接)工作正常。