【问题标题】:NodeJs appends data from asyncronous functionNode Js从异步函数追加数据
【发布时间】:2017-01-29 20:05:04
【问题描述】:

假设我的网页上有一个按钮和一个输出字段。 当我单击按钮时,会多次调用异步函数。 每次,该函数都会返回一些数据,我想将这些数据发送到输出字段(并附加到之前的数据)。

这里是 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);
            }
        );
    });
}

然后我有一个 index.js:

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

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

getHTML 返回一些数据,由 doParse 处理。 doParse 还会生成一些数据,这些数据应该被解析回输出字段。

我猜,post-method 不是正确的方法,这样做,因为它只被调用一次?

编辑 1:

问题是,我只能看到回调发送的第一个数据,然后我得到一个

(node:16436) UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):错误:发送后无法设置标头。

编辑 2:

'getHTML' 和 'doParse' 2 个函数的主要工作原理:

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);
};

【问题讨论】:

  • 帖子很好 - 您的困难的性质是什么?您还没有真正描述您遇到的问题
  • 正如@JaromandaX 提到的,请更详细地描述您的问题,但您应该在nodejs doParse 回调中使用 .end() 来发回响应:nodejs.org/api/…
  • 如上所述,我总是收到“发送后无法设置标题”错误。
  • @Soro 每个请求多久调用一次 doParse 回调?只有一次?
  • 不,我被叫了好几次......我上传了一些示例代码来展示它的原理

标签: javascript jquery node.js


【解决方案1】:

您应该使用 .write() 而不是 .send() 已经描述的here

因为.send() 只是res.write(); res.end() 的包装,完成后不要忘记手动以.end() 结束响应。

【讨论】:

  • 但我想每次都将数据发送到输出字段,调用 doParse。所以,我不想收集数据然后一次性发送。
  • 我在这个页面上发现的唯一一件事就是相应地设置标题,但没有任何改变: res.writeHead(200, { 'Connection': 'Transfer-Encoding', 'Content-Type ': 'text/plain; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Cache-Control': 'no-transform', 'X-Content-Type-Options': 'nosniff'} );在 google-chrome 上工作,我可以在检查器的“网络”选项卡中看到传入的消息,但它们只能在“res.end()”处呈现
  • @Soro 我认为这是 jquery 后回调,它在流结束时被调用。我在几个服务器-服务器应用程序中使用 .write 将数据从一个端点流式传输到另一个端点。也许你会研究类似stackoverflow.com/questions/7740646/… ang jquery 流处理的东西。
猜你喜欢
  • 2018-05-15
  • 2020-06-01
  • 1970-01-01
  • 2020-06-25
  • 2017-06-01
  • 2020-04-28
  • 1970-01-01
  • 2017-02-03
  • 2016-07-27
相关资源
最近更新 更多