javascript - promise 的 Node 链和代码可读性

标签 javascript node.js promise bluebird

我正在尝试从 Node 服务器发送多个请求/响应,因为它们是异步的,所以我必须深入研究并开始学习 Promise。我使用 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 链”发出另一个请求,例如 resolve(send_cert(caroot_cert)) 并且通常能够更好地修改这个请求/响应链。我觉得有很多样板代码只是为了调用这些方法。还有其他更易于管理和可读的方法吗?

此外,我不确定是否需要 promise 所有这些方法?比如说,如果 sign_device_cert 返回一个 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

为什么他们不遵守 promise ?

最佳答案

您不必将 promise 包裹在 promise 中。只做

function send_certificates (addr) {
    return send_csr_request(addr)
    .then(sign_device_cert)
    .then(send_cert);
}

这应该适用于您的情况(至少如果您的代码有效)。

有时,您不能只传递原始函数,因为它需要不同的参数(或不同的上下文)。在这些情况下,您仍然可以避免创建新的 promise :

return functionReturningAPromise()
.then(otherFunctionReturningAPromise) // takes as parameter the result of the previous one
.then(function(someValue){
    return yetAnotherFunctionReturningAPromise(22, someValue);
});

关于javascript - promise 的 Node 链和代码可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41999165/

相关文章:

javascript - highchart json 数据点

javascript - 在 AJAX JSF 请求后重新加载 Javascript

javascript - 在捕获被拒绝的 Promise 时对 Meteor.users 集合执行更新操作(使用 fcm-push+Meteor)

javascript - Promise.all 在带有参数的 promise 数组上

javascript - javascript确认对话框返回true后如何触发服务器端按钮的点击事件

javascript - 将父 'vm' 对象传递给自定义指令而不是方法(&)和模型(=)绑定(bind) Angular

node.js - Azure Nodejs SDK : long polling for queue message listener

javascript - 如何处理嵌套循环中的 promise

node.js - 元素存在后如何运行 selenium webdriver 代码

node.js - 如何使用 CAS 身份验证制作 Angular 5 + Node 应用程序?