我有一个用Mocha编写的集成测试,它需要在发生其他事情之前注册一个侦听器,否则我就会有一个比赛状态。
基本上,我是向某个HTTP服务器发送一个帖子,然后期待一个来自Kafka消息传递服务的回调,其中包含一些我需要检查的消息。(发送到http服务器的帖子是将消息放在kafka上)。
我的第一次割伤是在比赛状态下结束的。
var request = require("supertest-as-promised");
var Promise = require("bluebird");
beforeEach() { //set up kafka connection and kafkaConsumer ... }
describe('send-status', function statusSend() {
it("sends a post to the server and gets a message on kafka", function (done) {
request('http://myserver:8080')
.post('/myendpoint')
.type('json')
.send(stuff)
.expect(200)
})
.then(function () {
//todo: antipattern - can be replaced with a custom promisfier.
return new Promise(function (resolve, reject) {
kafkaConsumer.on('message', function (message) {
resolve(message)
})
//and reject cases
});
})
.then(function (message) {
//check message
done()
})
.catch() ...问题是,卡夫卡消息当然可以在帖子后立即被解雇,但就在第二个承诺之前,可以注册kafkaConsumer.on('message')听者。
因此,在启动链接中的post请求承诺之前,我需要注册kafkaConsumer.on('message')。
这就是我对节点和承诺的认识落空的地方。如果这是Java,我会创建一个可调用的方法来启动侦听器(可能有一个锁存等待,直到它在我的文章发布之前启动),将其抛到一个执行器上,并在以后使用它--该值要么已经存在,要么将等待它。
有了承诺,我不知道如何在链中调用kafkaConsumer.on('message')之前启动它。
我试过这样的方法,但是它很难看,而且仍然会导致比赛的结果:
function foo(message) {
return new Promise(function (resolve, reject) {
resolve(message);
});
}
describe(...)
it("sends post to ...", function(done) {
var onMessagePromise;
kafkaConsumer.on('message', function (message) {
onMessagePromise = foo(message)
});
request()
.then(function () {
return onMessagePromise;
})
.then ...我的另一个想法是在执行请求之前侦听消息,将其分配给一个变量,然后对该变量进行承诺解决.但是,如果这条信息是在承诺被兑现之后,而善良却违背了这一点,那就行不通了。在比赛条件下我能想到的一切结果。
发布于 2016-02-13 07:58:13
因此,在启动链接中的post请求承诺之前,我需要注册
kafkaConsumer.on('message')。
您可以这样做,根据您的解释,这听起来非常类似于如何在Java中解决这个问题(尽管我对Java不太了解,所以我相信这会有一些不同):
var kafkaPromise = new Promise(function (resolve, reject) {
kafkaConsumer.on('message', function (message) {
resolve(message);
})
//and reject cases
});
request('http://myserver:8080')
.post('/myendpoint')
.type('json')
.send(stuff)
.expect(200)
.then(function() {
return kafkaPromise;
})
.then(...)
.catch(...);如果kafkaPromise被解析,它的值将被使用;如果它仍然挂起,链将等待直到它被解析(或拒绝)才继续。
https://stackoverflow.com/questions/35377390
复制相似问题