response.responseText добавляет предыдущий responseText (node.js, прототип) - PullRequest
0 голосов
/ 02 сентября 2011

Это моя функция node.js, которая использует res.write:

function: ping(){
    res.write(JSON.stringify({"datatype":"ping"}));
    setTimeout(ping, 30000);
}

Это клиент, запрос записан в прототипе:

    this.pushconnection = new Ajax.Request(pushserveraddress, {
        method: 'get',
        evalJSON: 'false',
        onInteractive: this.pushconnectionInteractive.bind(this)
    });
}

pushconnectionInteractive: function(response) {
}

Проблема в том, что response.responseText будет расти с каждым проходящим res.write.

Пример:

1st ping() received: response.responseText = {"datatype":"ping"}

2nd ping() received: response.responseText = {"datatype":"ping"}{"datatype":"ping"}

3rd ping() received: response.responseText = {"datatype":"ping"}{"datatype":"ping"}{"datatype":"ping"}

Я не уверен, пересылает ли node.js данные или хранит ли прототипданные.Что мне нужно сделать, это иметь response.responseText = последние данные, отправленные без использования res.end();

Ответы [ 2 ]

0 голосов
/ 22 января 2015

каждый ответ добавляет к предыдущему, чтобы получить последний отправленный объект, если вы используете эту функцию php: (1-е добавление заголовков)

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('connection: keep-alive');

(2 отправленных данных)

function send_message($data_array) {
echo json_encode($data_array).PHP_EOL;
ob_flush();
flush();

}

в вашем js (Prototype): чтобы получить последний ответ

new Ajax.Request(sUrl, {
onInteractive:function(xhr){
var lastString = xhr.responseText.split("\n");
var lastObjectSent = lastString[lastString.length-2].evalJSON();
if(lastObjectSent.bValid){
    if(parseInt(lastObjectSent.bValid,10) === 1){
        this.status="finished";
        loadPage('done.php');
    }else{
        setNotification(oResult.sText,"Failure",5000);
    }
    }else if(lastObjectSent.progress){
    $('duplicatePassDates').down('.bar').setStyle('width:'+lastObjectSent.progress+'px');
}
},
onSuccess:function(xhr){
if(this.status!=="finished"){
    this.onInteractive(xhr);
}
},
0 голосов
/ 03 сентября 2011

Вы, вероятно, звоните this.pushconnection более одного раза.

Если вы создадите экземпляр this.pushconnection как его собственный объект Ajax и продолжите использовать тот же объект Ajax, то ваш ответ будет расти.

Попробуйте вместо этого:

this.pushconnection = function (pushserveraddress) {
  return new Ajax.Request(pushserveraddress, {
    method: 'get',
    evalJSON: 'false',
    onInteractive: this.pushconnectionInteractive.bind(this)
  });
}

Тогда вы можете назвать это, сказав:

var ajax = this.pushconnection("example.com");
...