Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Node.js/JavaScript中什么是同步,什么是异步_Javascript_Node.js_Asynchronous - Fatal编程技术网

了解Node.js/JavaScript中什么是同步,什么是异步

了解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

假设我在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)

  • 如果函数中的bar//do\u stuff涉及数据库查询(返回值取决于这些查询),该怎么办。在这种情况下,我是否可以确保res.send(result)将以正确的值执行,该值在功能栏完成后返回


  • 异步基本上就是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是务实的。异步对于耗时的任务很好,因为它不会阻塞JS的主线程


    在while循环的情况下,通常不需要将其设置为异步,但如果愿意,可以将其设置为异步(例如,您知道计算将花费很长时间,并且不希望阻塞主线程)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止,在结果到达之前什么也不做,这在Node.JS中不是一个大问题,但是在web页面的情况下,这将冻结UI,这肯定会激怒一些用户

    有几种方法可以解决异步任务

    • 回调——处理异步任务的函数,接受另一个函数作为参数,即
      回调
      ,该函数将在任务完成后立即调用(通常接受成功回调和错误回调)
    • 事件——处理异步任务的函数立即返回对象,该对象是
      事件发射器
      。您将回调附加到事件,该发射器将生成这些事件,然后在事件发生时发射器将调用这些回调。此回调被称为事件侦听器
    • promise——处理异步任务的函数立即返回对象,该对象表示某个未来结果的
      promise
      。这个承诺有一些方法,比如
      then()
      fail()
      总是()
      ,通过这些方法,您可以注册回调。它非常类似于事件发射器,承诺提供更好的数据流控制,但创建时不能中止

    • ES next——未来版本的JavaScript将提供ES6生成器或ES7异步函数
    您可以通过以下事实来区分async:它不会立即返回结果,但它通常允许您通过参数/参数或返回对象的方法注册回调以供以后调用

    注意:在ES6和ES7中,异步进程不需要回调,但我不会用这种新技术使这个主题更加复杂


    for
    循环不允许您注册回调,它只占用JS引擎并使所有迭代尽可能快。

    异步基本上就是一切,它会干扰JavaScript之外的环境。并不是因为它是必要的,而是因为它是务实的。异步对于耗时的任务很好,因为它不会阻塞JS的主线程


    在while循环的情况下,通常不需要将其设置为异步,但如果愿意,可以将其设置为异步(例如,您知道计算将花费很长时间,并且不希望阻塞主线程)。如果HTTP请求或数据库查询不是异步的,JS引擎将停止,在结果到达之前什么也不做,这在Node.JS中不是一个大问题,但是在web页面的情况下,这将冻结UI,这肯定会激怒一些用户

    有几种方法可以解决异步任务

    • 回调——处理异步任务的函数,接受另一个函数作为参数,即
      回调
      ,该函数将在任务完成后立即调用(通常接受成功回调和错误回调)
    • 事件——处理异步任务的函数立即返回对象,该对象是
      事件发射器
      。您将回调附加到事件,该发射器将生成这些事件,然后在事件发生时发射器将调用这些回调。此回调被称为事件侦听器
    • promise——处理异步任务的函数立即返回对象,该对象表示某个未来结果的
      promise
      。这个承诺有一些方法,比如
      then()
      fail()
      总是()
      ,通过这些方法,您可以注册回调。它非常类似于事件发射器,承诺提供更好的数据流控制,但创建时不能中止

    • ES next——未来版本的JavaScript将提供ES6生成器或ES7异步函数
    您可以通过以下事实来区分async:它不会立即返回结果,但它通常允许您通过参数/参数或返回对象的方法注册回调以供以后调用

    注意:在ES6和ES7中,异步进程不需要回调,但我不会用这种新技术使这个主题更加复杂


    for
    循环不允许您注册回调,它只是占用了JS引擎并使所有迭代尽可能快。

    因此您的第一个假设是正确的。如果创建一个函数并调用该函数,则所有代码都将在res.send之前完成。现在,如果在这些函数中进行任何数据库查询,它将不会等待这些查询完成后再继续。除了数据库查询之外,运行时还不会等待什么?我在哪里可以找到更多关于这种行为的信息?任何涉及离开你的c