2017-02-02 10 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 /応答のこのチェーンを変更することができるだろうを持っています。これらのメソッドを呼び出すだけの定型コードがたくさんあるような気がします。これを行うには他にも、管理しやすく読みやすい方法がありますか?

また、これらすべての方法を約束する必要があるかどうかはわかりません。たとえば、sign_device_certがPromiseを返す場合、.then()を呼び出してチェーンするにはどうすればいいですか?


EDITここ

が要求を送り出す私の機能..です

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())が追加されて、2番目のものは最初のもの、すなわちそれが逐次行われていない前に行われたと報告されます.. – enrm

+0

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