2

在我的 index.js 中,我有一个导出函数,它应该在按下提交按钮时通过 ajax 将数据发送回客户端。但是,当用户按下提交时,数据似乎在数据被修改之前就被发送了。再次按下提交时,它会发送先前修改的数据,就像单击提交按钮仅发送“先前”设置的数据一样。这是我的代码:

        var tabledata = getRecordFromDatabase(key);
        if(tabledata.length === 0)
            tabledata = 'There is no matched record in the database';
        res.contentType('text/html');
        res.send({'matched':tabledata});

所以为了说明错误:填写表格后单击提交并收到消息“数据库中没有匹配的记录”。我第二次点击提交,没有更改我刚刚填写的表格中的任何内容。这次记录数据实际上是发给我的。为什么会这样?

4

1 回答 1

4

如果您正在做的任何事情getRecordFromDatabase都是异步且非阻塞的,那么 node.js 的行为就应该如此。Node.js 是非阻塞的——它不会停止并等待进程完成(除非这些进程被故意写入阻塞,这通常在 node.js 中被避免)。这是有益的,因为它使服务器可以自由地接受新请求并一次处理许多请求。

如果您的数据库调用是异步的,那么您不会在res.send(). 这就是为什么您的第一次提交返回空。很可能,当您第二次点击提交时,您的数据库调用终于返回了,这就是您得到结果的原因。

很难为您的问题提供基于代码的答案,因为您抽象出了 DB 调用方法中发生的事情。但通常情况下,异步调用会像这样:

getRecordFromDatabase(key, function(err, data){
    if(data.length === 0)
        data = 'There is no matched record in the database';
    res.contentType('text/html');
    res.send({'matched':data});
});

这样,您将传递一个函数以作为异步方法的回调执行 - 当异步调用完成时,它执行回调,然后res.send()使用适当的数据执行回调。

于 2012-07-24T15:57:32.307 回答