作者?DhanjivPandey?本文来源?授权中文翻译?作者twitter?译者主页这个问题在今天仍然没有过时。#Q-11:回调地狱是什么?首先,你可以在理解回调之后给它点个赞。回调地狱是大量嵌套的回调,导致代码难以阅读和维护。让我们看下面的代码示例:elseconsole.log('Downloadfinished',photo)}console.log('Downloadstarted')在这种情况下,Node.js首先声明了displayPhoto函数。之后,它将调用downloadPhoto函数并将displayPhoto函数作为其回调传递。最后,代码在控制台上显示Downloadstarted。displayPhoto只会在downloadPhoto完成其所有任务后执行。#Q-12:如何避免Node.js中的回调地狱?Node.js在内部使用单线程事件循环来处理排队的事件。但是,如果任务的运行时间比预期的要长,这种方法可能会导致整个过程阻塞。Node.js通过合并回调(也称为高阶函数)解决了这个问题。因此,只要长时间运行的进程完成执行,就会触发关联的回调。通过这种方式,它允许代码在长时间运行的任务之后继续执行。然而,上述解决方案看起来很有前途。但有时,这会导致代码复杂且不可读。更多情况下会导致返回的回调链变长。由于这种前所未有的复杂性,调试代码可能很困难,而且可能很耗时。回调地狱问题有四种解决方案。1.程序模块化。它建议将逻辑划分为更小的模块。然后将它们从主模块连接在一起以达到预期的效果。2.使用异步机制。它是一个广泛使用的Node.js模块,提供连续的执行流。异步模块具有async.waterfallAPI,它使用下一个回调将数据从一个操作传递到另一个操作。另一个异步APIasync.map允许并行遍历一个项目列表并使用另一个结果列表进行回调。使用异步方法,调用者的回调仅被调用一次。这里的调用者是使用异步模块的主要方法。3.使用承诺机制。Promise提供了另一种编写异步代码的方法。它们要么返回执行结果,要么返回错误/异常。要实现承诺,您需要使用then()函数,它等待承诺对象返回。它有两个可选参数,是两个函数。根据承诺的状态,只会调用一个。如果承诺得到满足,将执行第一个函数调用。但是,如果Promise被拒绝,第二个函数将被调用。4.使用发电机。生成器是轻量级例程,通过yield关键字使函数等待和恢复。生成器函数使用特殊语法function*()。他们还可以使用promises或thunk等结构来挂起和恢复异步操作,并将同步代码转换为异步代码。#Q-13:你会用Nodejs搭建HTTP服务器吗,请说明你使用的代码?是的,我们可以在Node.js中创建HTTPServer。我们可以使用http-server命令来做到这一点。以下是示例代码:varhttp=require('http');varrequestListener=function(request,response){response.writeHead(200,{'Content-Type':'text/plain'});response.end('欢迎观众\n');}varserver=http.createServer(requestListener);server.listen(8080);//你想要开始的端口。#Q-14:Nodejs、AJAX和jQuery之间有什么区别?Node.js、AJAX和jQuery的一个共同特点是它们都是JavaScript的高级实现。但是,它们的用途完全不同。Node.js–它是用于开发客户端-服务器应用程序的服务器端平台。例如,如果我们必须构建一个在线员工管理系统,我们就不会使用客户端JS来实现它。但是Node.js肯定可以做到这一点,因为它运行在类似Apache的服务器上,而不是浏览器上。AJAX(又名异步Javascript和XML)——这是一种客户端脚本技术,主要用于在不刷新页面的情况下呈现页面内容。jQuery–这是一个众所周知的JavaScript模块,可以补充AJAX、DOM遍历、循环等。这个库提供了许多有用的函数来帮助JavaScript开发。但是,使用它不是强制性的,它还管理跨浏览器兼容性,因此它可以帮助您生成高度可维护的Web应用程序。#Q-15:Node.js中的全局变量是什么?Node.js中有三个关键字组成了Globals。它们是Global、Process和Buffer。GlobalGlobal关键字表示全局名称空间对象。它充当所有其他全局对象的容器。如果我们输入console.log(global)它将全部打印出来。关于全局对象需要注意的一件重要事情是,并非所有对象都在全局范围内,其中一些对象在模块范围内。因此,明智的做法是不要使用var关键字声明它们或将它们添加到Global对象中。使用var关键字声明的变量成为模块中的局部变量,而未声明的则订阅全局对象。Process也是全局对象之一,但包含将同步函数转换为异步回调的附加函数。从代码中的任何地方访问它都没有限制。它是EventEmitter类的一个实例。每个节点应用程序对象都是Process对象的一个??实例。它主要返回有关应用程序或环境的信息。
