首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >承诺中的处理在需要解决之前如何触发,就像java未来一样?

承诺中的处理在需要解决之前如何触发,就像java未来一样?
EN

Stack Overflow用户
提问于 2016-02-13 07:39:54
回答 1查看 90关注 0票数 0

我有一个用Mocha编写的集成测试,它需要在发生其他事情之前注册一个侦听器,否则我就会有一个比赛状态。

基本上,我是向某个HTTP服务器发送一个帖子,然后期待一个来自Kafka消息传递服务的回调,其中包含一些我需要检查的消息。(发送到http服务器的帖子是将消息放在kafka上)。

我的第一次割伤是在比赛状态下结束的。

代码语言:javascript
复制
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')之前启动它。

我试过这样的方法,但是它很难看,而且仍然会导致比赛的结果:

代码语言:javascript
复制
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 ...

我的另一个想法是在执行请求之前侦听消息,将其分配给一个变量,然后对该变量进行承诺解决.但是,如果这条信息是在承诺被兑现之后,而善良却违背了这一点,那就行不通了。在比赛条件下我能想到的一切结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-13 07:58:13

因此,在启动链接中的post请求承诺之前,我需要注册kafkaConsumer.on('message')

您可以这样做,根据您的解释,这听起来非常类似于如何在Java中解决这个问题(尽管我对Java不太了解,所以我相信这会有一些不同):

代码语言:javascript
复制
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被解析,它的值将被使用;如果它仍然挂起,链将等待直到它被解析(或拒绝)才继续。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35377390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档