2017-02-02 26 views
0

我試圖從節點服務器發送幾個請求/響應,並且因爲它們是異步的,我不得不潛入並開始學習承諾。我使用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)); 
     }) 
    }); 
} 

理想情況下,我想一巴掌另一個請求這個「諾言鏈」,像resolve(send_cert(caroot_cert)) ,只是一般能夠修改這條產業鏈reqeust的/響應好一點。我覺得有很多樣板代碼只是爲了調用這些方法。有沒有其他的,更易於管理和可讀的方式來做到這一點?

另外我不確定是否需要promisify所有這些方法?如果說,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 

爲什麼他們不」尊重承諾?

回答

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

從resolve()函數中推斷出哪些數據會放入下一個函數中? ?如果不是所有的函數都返回一個值或解決什麼? – enrm

+0

這似乎並不奏效。當我這樣做的時候,添加了.then(send_cert())(在第一個之後),第二個報告在第一個之前完成,即它沒有按順序完成.. – enrm

+0

'send_cert()'!=='send_cert ' –