BlueBird と amqplib を使用した TypeScript です。敗者だけが「延期」を使用することをどこかで読みましたが、敗者になりたくありません(少なくともこの理由で)。だから私はこれなしでこれを書き直そうとしました-無駄に(まだ):
public Request<Rq extends IPublishable, Rs extends IPublishable>(request: Rq): { ackd: Promise<boolean>; response: Promise<Rs> } {
var ackdPromise: Promise<boolean>;
var responsePromise: Promise<Rs>;
var confirmPublish = Promise.promisify(this.ConfirmChannel.publish, this.ConfirmChannel);
var consumerTag = uuid.v4();
var responseQueue = Bus.rpcQueueBase + consumerTag;
var responseDeferred = Promise.defer<Rs>();
var handleResponse = (msg: IPublishedObj): void => {
//ack first
this.ConfirmChannel.ack(msg);
this.ConfirmChannel.cancel(consumerTag);
responseDeferred.resolve(Bus.FromSubscription(msg));
}
responsePromise = responseDeferred.promise;
ackdPromise = Promise.resolve(this.ConfirmChannel.assertQueue(responseQueue, { durable: false, exclusive: true, autoDelete: true }))
.then((okQueueReply) => Promise.resolve(this.ConfirmChannel.consume(responseQueue, handleResponse, { consumerTag: consumerTag })))
.then((okSubscribeReply) => Promise.resolve(this.ConfirmChannel.assertExchange(Bus.rpcExchange, 'direct', { durable: true, autoDelete: false })))
.then((okExchangeReply) => confirmPublish(Bus.rpcExchange, request.GetType(), Bus.ToBuffer(request), { type: request.GetType(), replyTo: responseQueue }))
.then(this.handleAck, this.handleNack)
.catch((failReason) => {
console.error(util.format('Error publishing: %s', failReason));
return false;
});
return { ackd: ackdPromise, response: responsePromise };
}
同様の方法をすべて変換し、これでいくつか実行しましたが、不足し続けています。おそらく、2 つの値 (ack の約束と応答の約束) を返そうとしているためかもしれませんが、実際には、埋め込みハンドラーを呼び出した結果の最終的な結果の約束を返そうとすることに関係していると思います-遅延を使用しません。
あなたは(してください)もっとうまくできますか(または延期してもいいと教えてください)?