承诺的节点链和代码可读性

时间:2017-02-02 10:01:46

标签: javascript node.js promise bluebird

我试图从节点服务器发送多个请求/响应,并且由于它们是异步的,我不得不潜入并开始学习承诺。我正在使用bluebirdnode以及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)) 并且通常能够更好地修改这一系列的需求/响应。我觉得有很多样板代码只是为了调用这些方法。还有其他更易于管理和可读的方法吗?

此外,我不确定是否需要宣传所有这些方法?例如,如果sign_device_cert返回承诺,如何将其与.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

他们怎么不尊重承诺?

2 个答案:

答案 0 :(得分:2)

你不必在承诺中包含承诺。只做

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);
});

答案 1 :(得分:0)

您可以用这种方式编写代码,以提高代码的可读性。

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链中断;