了解Node.js/JavaScript中什么是同步,什么是异步
假设我在Node.js应用程序中有以下代码:了解Node.js/JavaScript中什么是同步,什么是异步,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,假设我在Node.js应用程序中有以下代码: function bar(){ //do_stuff return value; } app.get('/',function(req,res){ var result = bar(); res.send(result); }); 假设在函数栏中//do_stuff是一个while循环,最多可达1000万次。是否保证函数将完成,返回其值,该值将被分配给结果,然后才执行res.send(result) 如果函数中的b
function bar(){
//do_stuff
return value;
}
app.get('/',function(req,res){
var result = bar();
res.send(result);
});
异步基本上就是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是务实的。异步对于耗时的任务很好,因为它不会阻塞JS的主线程
在while循环的情况下,通常不需要将其设置为异步,但如果愿意,可以将其设置为异步(例如,您知道计算将花费很长时间,并且不希望阻塞主线程)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止,在结果到达之前什么也不做,这在Node.JS中不是一个大问题,但是在web页面的情况下,这将冻结UI,这肯定会激怒一些用户 有几种方法可以解决异步任务
- 回调——处理异步任务的函数,接受另一个函数作为参数,即
,该函数将在任务完成后立即调用(通常接受成功回调和错误回调)回调
- 事件——处理异步任务的函数立即返回对象,该对象是
。您将回调附加到事件,该发射器将生成这些事件,然后在事件发生时发射器将调用这些回调。此回调被称为事件侦听器事件发射器
- promise——处理异步任务的函数立即返回对象,该对象表示某个未来结果的
。这个承诺有一些方法,比如promise
,then()
,fail()
,通过这些方法,您可以注册回调。它非常类似于事件发射器,承诺提供更好的数据流控制,但创建时不能中止总是()
- ES next——未来版本的JavaScript将提供ES6生成器或ES7异步函数
for
循环不允许您注册回调,它只占用JS引擎并使所有迭代尽可能快。异步基本上就是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是务实的。异步对于耗时的任务很好,因为它不会阻塞JS的主线程
在while循环的情况下,通常不需要将其设置为异步,但如果愿意,可以将其设置为异步(例如,您知道计算将花费很长时间,并且不希望阻塞主线程)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止,在结果到达之前什么也不做,这在Node.JS中不是一个大问题,但是在web页面的情况下,这将冻结UI,这肯定会激怒一些用户 有几种方法可以解决异步任务
- 回调——处理异步任务的函数,接受另一个函数作为参数,即
,该函数将在任务完成后立即调用(通常接受成功回调和错误回调)回调
- 事件——处理异步任务的函数立即返回对象,该对象是
。您将回调附加到事件,该发射器将生成这些事件,然后在事件发生时发射器将调用这些回调。此回调被称为事件侦听器事件发射器
- promise——处理异步任务的函数立即返回对象,该对象表示某个未来结果的
。这个承诺有一些方法,比如promise
,then()
,fail()
,通过这些方法,您可以注册回调。它非常类似于事件发射器,承诺提供更好的数据流控制,但创建时不能中止总是()
- ES next——未来版本的JavaScript将提供ES6生成器或ES7异步函数
for
循环不允许您注册回调,它只是占用了JS引擎并使所有迭代尽可能快。因此您的第一个假设是正确的。如果创建一个函数并调用该函数,则所有代码都将在res.send之前完成。现在,如果在这些函数中进行任何数据库查询,它将不会等待这些查询完成后再继续。除了数据库查询之外,运行时还不会等待什么?我在哪里可以找到更多关于这种行为的信息?任何涉及离开你的c