2017-01-29 2 views
0

Nehmen wir an, ich habe eine Schaltfläche auf meiner Webseite und ein Ausgabefeld. Wenn ich auf die Schaltfläche klicke, wird eine asynchrone Funktion mehrmals aufgerufen. Jedes Mal gibt die Funktion einige Daten zurück, die ich an das Ausgabefeld senden (und an die vorherigen Daten anhängen) möchte. HierNodeJs hängt Daten von der asynchronen Funktion an

ist die main.js:

$(document).ready(function() { 
$("#submitButton").on('click', function() { 
     $.post(
      '/', 
      { 
       text: inputField.val(), 
       depth: $('#depthField').val() 
      }, 
      function (response) { 
       let outField = $('#outputField'); 
       let txt = outField.text().trim(); 
       outField.text(txt + "\n new data: " + response); 
      } 
     ); 
    }); 
} 

Und dann habe ich eine index.js:

router.post('/', function (req, res) { 
    let text = req.body.text; 

    getHTML(text, function (buf) { 
     doParse(buf, function (out) { 
      res.send(out); 
     }) 
    }); 
}); 

getHTML gibt einige Daten, die von doParse vorgegangen wird. Der doParse erzeugt auch einige Daten, die zurück in das Ausgabefeld geparst werden sollen.

Ich denke, die Post-Methode ist nicht der richtige Weg, um dies zu tun, weil es nur einmal aufgerufen wird?

EDIT 1:

Das Problem ist, dass ich nur die ersten Daten sehen kann, die durch den Rückruf senden, so erhalte ich ein

(node: 16436) UnhandledPromiseRejectionWarning: Unbehandelte Ablehnung des Versprechens (Zurückweisungs-ID: 1): Fehler: Nach dem Senden können keine Header festgelegt werden.

EDIT 2:

Hauptarbeits der 2 Funktionen 'getHTML' und 'doParse':

const getHTML = function(callback) { 
    for (let j = 0; j < 10; j++) { 
     callback(j); 
    } 
}; 

const doParse = function(buf, callback) { 
    let msg = 'val = ' + buf; 

    console.log(msg); 
    callback(msg); 
}; 
+0

Beitrag ist in Ordnung - was ist die Art Ihrer Schwierigkeit? Sie haben nicht wirklich ein Problem beschrieben, das Sie haben –

+0

als @ JaromandaX erwähnt bitte beschreiben Sie Ihr Problem im Detail, aber Sie sollten.end() in Ihrem Nodejs doParse Callback verwenden, um die Antwort zurück zu senden: https://nodejs.org/ api/http.html # http_response_end_data_encoding_callback –

+0

Wie oben bearbeitet, erhalte ich immer einen 'Kann nicht festlegen, Kopfzeilen, nachdem sie gesendet werden' Fehler. – Soro

Antwort

0

sollten Sie .write() anstelle von .send(), wie bereits here beschrieben.

als .send() ist nur ein Wrapper für res.write(); res.end() vergessen Sie nicht, die Antwort mit .end() manuell zu beenden, nachdem Sie fertig sind.

+0

Aber ich möchte die Daten jedes Mal an das Ausgabefeld senden, doParse wird aufgerufen. Also, ich möchte nicht die Daten sammeln und dann alle auf einmal senden. – Soro

+0

@Soro siehe https://StackOverflow.com/Questions/9751711/streaming-http-responses-with-nodejs –

+0

Das einzige, was ich auf dieser Seite fand, war, den Header entsprechend einzustellen, aber nichts änderte sich: res .writeHead (200, { 'Verbindung': 'Transfer-Encoding', 'Inhaltstyp': 'text/plain; Zeichensatz = utf-8', 'Transfer-Encoding': 'chunked', 'Cache- Control ':' no-transform ', ' X-Content-Type-Optionen ':' nosniff '}); Arbeiten auf Google-Chrome, kann ich die eingehenden Nachrichten in der 'Netzwerk'-Registerkarte im Inspektor zu sehen, aber sie werden nur bei' res.end() 'gerendert – Soro

Verwandte Themen