承诺的节点链和代码可读性
Node chain of promises and code readability
我正在尝试从节点服务器发送几个 request/responses,因为它们是异步的,所以我不得不深入研究并开始学习 promises。我正在使用 bluebird
和 node
以及 request
来发送请求。
我希望建立一个证书链,我的服务器是受信任的第三方。我有以下
function send_certificates (addr) {
return send_csr_request(addr)
.then(function(csr) {
return new Promise(function(resolve,reject) {
resolve(sign_device_cert(csr))}
)}).then(function(signed_cert) {
return new Promise(function(resolve,reject) {
//another resolve here?
resolve(send_cert(signed_cert));
})
});
}
理想情况下,我想对这个 "promise-chain" 提出 另一个 请求,比如 resolve(send_cert(caroot_cert))
并且通常能够更好地修改 reqeust/responses 的这条链。我觉得有很多样板代码只是为了调用这些方法。还有其他更易于管理和可读的方法吗?
另外我不确定我是否需要承诺所有这些方法?例如,如果 sign_device_cert
returns 一个 Promise,我如何将它与 .then()
调用链接起来?
编辑
这是我发送请求的函数..
function send_ca_cert(cert) {
const url_string = "http://myaddress.com";
var request_options = {
url : url_string,
proxy : my_proxy,
body: pki.certificateToPem(cert),
headers: { "someHeader : "somevalue"}
};
return new Promise((resolve,reject) => {
request.postAsync(request_options, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log("Sent off ca cert" );
resolve();
}
reject();
});
});
}
当我打电话给 then(send_cert).then(send_ca_cert)
时,我得到了照片
Sent off ca cert
Sent off cert
他们怎么不遵守承诺?
您不必将承诺包装在承诺中。只做
function send_certificates (addr) {
return send_csr_request(addr)
.then(sign_device_cert)
.then(send_cert);
}
这应该适用于您的情况(至少如果您的代码有效)。
有时,您不能只传递原始函数,因为它需要不同的参数(或不同的上下文)。在这些情况下,您仍然可以避免创建新的承诺:
return functionReturningAPromise()
.then(otherFunctionReturningAPromise) // takes as parameter the result of the previous one
.then(function(someValue){
return yetAnotherFunctionReturningAPromise(22, someValue);
});
您可以用这种方式编写代码,以提高代码的可读性。
let promise = someAsyncFunction();
promise = promise.then((data) => { // here data is value if returned by function
return someAnotherAsyncCall();
});
promise = promise.then((data) => {// here data is value if returned by the previous function //}
return someAnotherAsyncCall();
});
// 同样可以进行!
// 不要忘记使用箭头函数,它们也有助于提高代码的可读性,必须在 promise 末尾使用 return 语句以避免 promise 链中断;
我正在尝试从节点服务器发送几个 request/responses,因为它们是异步的,所以我不得不深入研究并开始学习 promises。我正在使用 bluebird
和 node
以及 request
来发送请求。
我希望建立一个证书链,我的服务器是受信任的第三方。我有以下
function send_certificates (addr) {
return send_csr_request(addr)
.then(function(csr) {
return new Promise(function(resolve,reject) {
resolve(sign_device_cert(csr))}
)}).then(function(signed_cert) {
return new Promise(function(resolve,reject) {
//another resolve here?
resolve(send_cert(signed_cert));
})
});
}
理想情况下,我想对这个 "promise-chain" 提出 另一个 请求,比如 resolve(send_cert(caroot_cert))
并且通常能够更好地修改 reqeust/responses 的这条链。我觉得有很多样板代码只是为了调用这些方法。还有其他更易于管理和可读的方法吗?
另外我不确定我是否需要承诺所有这些方法?例如,如果 sign_device_cert
returns 一个 Promise,我如何将它与 .then()
调用链接起来?
编辑
这是我发送请求的函数..
function send_ca_cert(cert) {
const url_string = "http://myaddress.com";
var request_options = {
url : url_string,
proxy : my_proxy,
body: pki.certificateToPem(cert),
headers: { "someHeader : "somevalue"}
};
return new Promise((resolve,reject) => {
request.postAsync(request_options, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log("Sent off ca cert" );
resolve();
}
reject();
});
});
}
当我打电话给 then(send_cert).then(send_ca_cert)
时,我得到了照片
Sent off ca cert
Sent off cert
他们怎么不遵守承诺?
您不必将承诺包装在承诺中。只做
function send_certificates (addr) {
return send_csr_request(addr)
.then(sign_device_cert)
.then(send_cert);
}
这应该适用于您的情况(至少如果您的代码有效)。
有时,您不能只传递原始函数,因为它需要不同的参数(或不同的上下文)。在这些情况下,您仍然可以避免创建新的承诺:
return functionReturningAPromise()
.then(otherFunctionReturningAPromise) // takes as parameter the result of the previous one
.then(function(someValue){
return yetAnotherFunctionReturningAPromise(22, someValue);
});
您可以用这种方式编写代码,以提高代码的可读性。
let promise = someAsyncFunction();
promise = promise.then((data) => { // here data is value if returned by function
return someAnotherAsyncCall();
});
promise = promise.then((data) => {// here data is value if returned by the previous function //}
return someAnotherAsyncCall();
});
// 同样可以进行! // 不要忘记使用箭头函数,它们也有助于提高代码的可读性,必须在 promise 末尾使用 return 语句以避免 promise 链中断;