js数据库信息交互 js调用数据库数据

与数据库交互看起来是一个很简单的事情,但由于Node.js的异步性质使得这一切并不是那么简单 。通过Node.js编写异步代码有很多选择,每个都需要进行不同编码 。在本系列中,我们将提供一些示例来说明如何利用各种异步模式获取、使用和关闭连接 。在这篇文章中,我们将探讨异步编程与传统编程的区别 。

js数据库信息交互 js调用数据库数据

文章插图
try…catch…finally
JavaScript有一个try…catch…finally语句,try…catch部分很容易:运行某些代码并捕获异常,以便它们得到适当处理 。但为什么我们需要finally?finally提供了一种允许你运行代码清理的方法,无论异常在try还是catch块中 。清理代码通常包括关闭文件处理和数据库链接 。
下面是例子:
如果你在浏览器控制台(或者Node.js)中运行,你会在控制到看到类似内容:
请注意catch块中引发的bar异常最终会作为未处理的异常,但在finally块执行之前不会起作用 。
如果我们在Node.js中运行的所有代码都是异步,我们可以这样做:
不幸的是,try…catch…finally对于异步代码并不是非常有用—至少在异步函数可用之前,原因与Node.js中异步工作原理有关 。
异步/事件处理
下面让我们看看异步操作如何执行,例如执行HTTP请求和执行数据库查询 。
所有JavaScript代码在主线程运行,异步API从主线程调用并传递回调函数 。根据类型不同,异步工作可能完全作为事件或者可能利用线程池 。当异步工作完成时,回调函数被添加到回调对象,以便尽快在主线程上调用 。
【js数据库信息交互 js调用数据库数据】对于这种架构,在异步处理期间发生的错误会在完全不同的调用堆栈中带回到主线程 。你不能捕捉在不同调用堆栈中引发的错误—为时太晚!
下面是调用异步API的非常简单的演示:
setTimeout(function() {
console.log(‘hello’);
}, 2000);
console.log(‘world’);
如果你在浏览器控制台或Node.js中运行该脚本,则输出是:
world
hello
在hello前两秒看到world会让异步编程新手感到惊讶 。这里的秘密是传递到setTimeout的回调函数,它会“回调”,或者当指定时间过去时在主线程执行 。
回调函数可追溯到JavaScript的开始,JavaScript被设计为将生活带到网络的语言 。JavaScript开发人员需要将代码与事件关联(例如加载页面、点击鼠标或者按键),随着时间推移,下面这种DOM API被引入:
window.addEventListener(‘load’, function() {
// do some work
});
上面的addEventListener方法将传入的异步函数作为第二个参数,并将其添加到windows元素load event相关的侦听器列表中 。当该事件发生时,所有监听器被添加到回调对象,并将尽快被调用 。
为了让回调正常工作,JavaScript中的函数需要重要的功能:它们需要是第一类对象,并需要关闭 。
函数作为第一类
函数作为第一类对象的概念听起来很复杂 。大多数编程语言提供了声明变量和创建命名代码单元的方法,通常被称为函数或过程 。这两种结构之间通常有明确的区别,例如,你可以声明变量并将其传递给函数,但你不能将函数传递给函数 。
另一方面,JavaScript允许函数可用作更标准数据类型(例如Number、String和Boolean) 。函数可以被声明,从函数传递到函数,并可在未来某个时候被调用 。函数作为第一类对象是传递函数到另一函数的前提条件 。
想象一下,当页面加载以及当用户点击窗口时你想要执行相同的代码,你可以这样做: