2016-11-09 63 views
0

我试图做一个ajax调用(使用jquery)并且在服务器到达时立即呈现响应。在服务器中,我准备好后立即发送不同的响应。如果我使用curl发出请求,我可以看到他们如何通过响应在屏幕响应中进行打印。但我不能用jQuery ajax做类似的事情。javascript和revel之间的长时间轮询golang服务器

在服务器上的代码是这样的:

flusher, ok := app.Response.Out.(http.Flusher) 
if !ok { 
    panic("expected http.ResponseWriter to be an http.Flusher") 
} 

app.Response.Out.Header().Set("Connection", "Keep-Alive") 
app.Response.Out.Header().Set("Transfer-Encoding", "chunked") 
app.Response.Out.Header().Set("X-Content-Type-Options", "nosniff") 
fmt.Fprintf(app.Response.Out, string(JsonOffers)) 
flusher.Flush() 

的这段代码被调用到一个循环。 app.Response.Outhttp.ResponseWriter

我的要求去做,是一种正常的jquery.ajax功能:

jQuery.ajax({ 
    url: '/ndc', 
    type: "POST", 
    data: ODRequest, 
    success: function(offers){ 
     console.log('Offers', offers) 
    }, 
    error: function(x,y,z){console.log("ERROR", x);} 
    }) 

有了这个,我得到的所有报价,但只有当最后的响应进行处理,不一一。

还有一件事...(我不知道它可能是重要的)服务器控制台我可以看到这个上,在每一个请求:

server.go:2161: http: multiple response.WriteHeader calls 
+0

数据必须在键 - >值对。在ajax函数中,将'data:ODRequest'重命名为'data:{control:'ODRequest'}',并且必须更新必要的服务器端。还要添加'dataType:'json''到ajax函数 –

+0

Hi @AniketSahrawat ODRequest是一个json对象。而在服务器上,我可以得到所有的字段......所以我认为现在不是这样。不管怎么说,还是要谢谢你。 –

+0

它看起来像你想'流'的数据..你可以看到卷曲打印响应的响应,因为它是流媒体。我不确定ajax的方式,但如果它不是一个强有力的要求,你可以通过websocket写回应。 – algrebe

回答

0

请,更精确地描述过程,你的应用程序以同样的方式工作,像这样?

Js脚本应该向服务器发送请求,并且当收到响应时再次发送请求。

var ajaxFunc = function() { 
    // handle response and again call 
    ajaxFunc(); 
}; 

当服务器接收到请求时,它必须运行一定时间的循环(可以是20-30秒),并且将更新发送到客户端

+0

Hi @korchemkin。不...我的应用程序不能以这种方式工作。 js只能做一个请求(当用户点击一个按钮时)。此请求到达必须构建响应的服务器,并且此响应由三个块组成。这个块(通过内部处理)在它们之间具有不同的延迟,但是服务器一旦建立就会抛出每个块。而在你公开的情况下,似乎js使ajax调用递归。 –