在我的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});
为了说明错误:我在填写表格后点击提交并收到消息“数据库中没有匹配的记录”。我第二次点击提交而没有改变我刚刚填写的表格中的任何内容。这段时间记录数据实际上是发给我的。为什么会这样?
答案 0 :(得分: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()
。